网络游戏开发 -C++ 程序设计

30
专专专专 专专专专专专 网网网网网网 -C++ 网网网网 专 1 专 C++ 专专专专专专

description

第 1 章 C++ 程序设计基础. 网络游戏开发 -C++ 程序设计. 第 9 章 模板与 STL. 标准模板库 常用的容器. 容器的概念 迭代器. 映射的概念 迭代器的使用. 了解标准模板库 掌握常用容器的使用. 第 9 章 模板与 STL. 9.2 STL 的使用. STL ( Standard Temporary Library )是 C++ 标准的一部分 提供一系列核心组件: 用以支持 I/O 、 字符串( strings ) 容器(数据结构) 算法(排序、搜索、合并等等) 数值计算、多字符集等主题。. 第 9 章 模板与 STL. - PowerPoint PPT Presentation

Transcript of 网络游戏开发 -C++ 程序设计

Page 1: 网络游戏开发 -C++ 程序设计

专业教程理论讲解部分

网络游戏开发 -C++程序设计

第 1 章 C++ 程序设计基础

Page 2: 网络游戏开发 -C++ 程序设计

第 9 章 模板与 STL

标准模板库常用的容器

容器的概念迭代器

映射的概念迭代器的使用

了解标准模板库掌握常用容器的使用

Page 3: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用

STL ( Standard Temporary Library)是 C++标准的一部分

提供一系列核心组件:用以支持 I/O、

字符串( strings)

容器(数据结构)

算法(排序、搜索、合并等等)

数值计算、多字符集等主题。

Page 4: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.1 STL 中的容器的概念和要求

STL中的容器( Container)是可容纳一些数据的模板类,包括

vectorlistsetmap

具有保存和操作数据集合的能力 .

具有保存和操作数据集合的能力 .

大大方便了程序员对程序中数据的组织和保存

大大方便了程序员对程序中数据的组织和保存

提高了开发效率。提高了开发效率。

Page 5: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.1 STL 中的容器的概念和要求

STL容器的特点

1)插入操作时,内部实现的是拷贝操作,置于容器内。

2)所有元素形成一个次序( order)。

3)各项操作并非绝对安全。

容器有相同的函数接口这些函数主要是用于进行数据比较、迭代和存储的

Page 6: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

操作 功能ContType c 产生一个未含任何元素的空容器

ContType c1(c2) 产生一个同型容器ContType c(beg, end) 复制 [beg; end]区间内的元素,作为容器初值

c.~ContType() 删除所有元素,释放内存c.size() 返回容器中的元素数量c.empty() 判断容器是否为空(相当于 size()==0,但可能更快)

c.max_size() 返回元素的最大可能数量c1 == c2 判断是否 c1等于 c2

c1 != c2 判断是否 c1不等于 c2,相当于 !(c1==c2)

c1 < c2 判断是否 c1小于 c2

c1 > c2 判断是否 c1大于 c2,相当于 c2<c1

c1 <= c2 判断是否 c1小于等于 c2,相当于 !(c2<c1)

c1 >= c2 判断是否 c1大于等于 c2,相当于 !(c1<c2)

9.2 STL 的使用9.2.1 STL 中的容器的概念和要求

各个容器共通的函数

Page 7: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

c1 = c2 将 c2的所有元素赋值给 c1

c1.swap(c2) 交换 c1和 c2的数据swap(c1, c2) 同上,是个全局函数c.begin() 返回一个迭代器,指向第一元素c.end() 返回一个迭代器,指向最后元素的下一位置

c.rbegin() 返回一个逆向迭代器,指向逆向遍历时的第一元素c.rend() 返回一个逆向迭代器,指向逆向遍历时的最后元素的下一位置

c.insert(pos, elem) 将 elem的一份副本安插于 pos处。返回值和 pos的意义并不相同c.erase(beg, end) 移除 [beg; end]区间内的所有元素。某些容器会返回未被移除的第

一个接续元素c.clear() 移除所有元素,令容器为空

c.get_allocator() 返回容器的内存模型( memory model)

9.2 STL 的使用9.2.1 STL 中的容器的概念和要求

Page 8: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.1 STL 中的容器的概念和要求

“能够遍历某个序列内的所有元素”的对象。

它可以通过与一般指针一致的接口来完成自已的工作。

迭代器奉行一个纯抽象概念:任何东西,只要行为类似迭代器,那么它就是一种迭代器。

迭代器( iterator)

Page 9: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

vector容器,可以理解为是一个动态数组。它包含在头文件 <vector>中。

1 . vector 的能力和使用

namespace std {template <class T,

class Allocator = allocator<T>>class vector;

}

其中元素 T可以是任意数据类型,只要 T具有赋值和拷贝能力。

Page 10: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

vector作为一个类似于动态数组的容器

1 . vector 的能力和使用

1)它是一个有序集群( ordered collection) ,支持随机存取,因此只要知道位置,就可以存取这个元素;

2)在末端附加或删除元素时, vector性能很高。

3) vector的容量是可配置的。

4)可以使用 reserve()配置容量。(只能用来扩大容量,但不能缩减容量)std::vector<int> v;v.reserve(80);

Page 11: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

1 . vector 的能力和使用

vector<int> v;

vector<int>::iterator iter;

// 增加元素v.reserve(20);

v.push_back(5);

v.push_back(10);

v.push_back(20);

// 插入元素v.insert(v.begin()+2, 15);

// 遍历访问cout<<"v= ";

for (iter = v.begin(); iter != v.end(); iter++)

{

cout<<" "<<*iter;

}

v.erase(v.begin() +1);

Page 12: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

2. list 的能力和使用

namespace std {

template <class T,

class Allocator = allocator<T>>

class list;

}

list容器可以理解为是一个双向链表。它包含在头文件 <list>中

元素 T可以是任意数据类型,只要 T具有赋值和拷贝能力。参数 Allocator是用于定义内存模型的,在使用时采用默认参数即可。

Page 13: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

2. list 的能力和使用

list作为一个类似于双向链表的容器,它具有如下特点:

1)不支持随机存取

2)在任何位置上的插入和删除操作,性能都是很高的。

3 ) list没有容量的概念,所以也没有空间重新分配等操作;

Page 14: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用

函数 功能c.unique() 如果存在若干相邻而数值相等的元素,就删除重复元素,只留一个

c.unique(op) 如果存在若干相邻元素,都使 op()的结果为 true,则删除重复元素,只留一个

C1.splice(pos, c2) 将 c2内的所有元素转移到 c1之内,迭代器 pos之前C1.splice(pos, c2,

c2pos)

将 c2内的 c2pos的所指元素转移到 c1内的 pos所指位置上( c1 和 c2可相同)

C1.splice(pos, c2,

c2beg, c2end)

将 c2内的 [c2beg; c2end]区间内所有元素转移到 c1内的 pos之前( c1

和 c2可相同)c.sort() 以 operator<为准则,对所有元素排序

c.sort(op) 以 op()为准则,对所有元素排序C1.merge(c2) 假设 c1 和 c2容器都包含已序( sorted)元素,将 c2的全部元素转移到

c1,并保证合并后的 list仍为已序 C1.merge(c2, op) 假设 c1 和 c2容器都包含 op()原则下的已序( sorted)元素,将 c2的全

部元素转移到 c1,并保证合并后的 list仍为已序c.reverse() 将所有元素反序( reverse the order)

– [fww1]什么是已序?

Page 15: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

2. list 的能力和使用

list <int> c1, c2, c3;

list <int>::iterator c1_Iter, c2_Iter, c3_Iter;

// 赋值c1.push_back( 3 );

c1.push_back( 6 );

c3.push_back( 1 );

 

cout << "c1 =";

for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )

cout << " " << *c1_Iter;

c2.merge( c1 );

Page 16: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

3. set 的能力和使用

namespace std {

template <class T,

class Compare = less<T>,

class Allocator = allocator<T>>

class set;

}

包含在头文件 <set>中

其中元素T可以是任意数据类型,只要T具有赋值和拷贝能力。第二个参数 Compare用于确定按什么数据类型来排序,使用默认参数即可。第三个参数 Allocator是用于定义内存模型的,在使用时采用默认参数即可。

Page 17: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

3. set 的能力和使用

set作为一个类似于平衡二叉树的容器

1)具有自动排序能力,使元素的搜索有良好性能;

2)由于二叉树的特点决定,对 set容器中的元素不能直接修改。如果想修改,可以采用的办法是先删除这个元素,再插入新的元素;

3 ) set不提供用来直接存取元素的任何操作。通过迭代器进行元素间接存取,可视这些元素是常数。

4 ) set在元素搜寻方面有优化设计,所以提供了特殊的搜寻函数。

Page 18: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

3. set 的能力和使用

函数 功能count(elem) “返回 元素值为 elem”的元素个数find(elem) “返回 元素值为 elem”的第一个元素,如果找不到就返回 end()

lower_bound(el

em)

返回 elem “的第一个可插入位置,也就是 元素值 >= elem”的第一个元素位置

upper_bound(el

em)

返回 elem “的最后一个可插入位置,也就是 元素值 > elem”

的第一个元素位置equal_range(el

em)

返回 elem “可插入的第一个和最后一个位置,也就是 元素值

== elem”的第一个元素区间

Page 19: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

3. set 的能力和使用

set <int> s1;set <int> :: const_iterator s1_AcIter, s1_RcIter;

// 赋值s1.insert( 10 );s1.insert( 20 );s1.insert( 30 );

s1_RcIter = s1.lower_bound( 20 );cout << *s1_RcIter << "." << endl;s1_RcIter = s1.lower_bound( 40 );

Page 20: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

4 . map 的能力和使用

map容器可以理解为是一个平衡二叉树实现的关联式容器。

namespace std {template < class Key,

class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> >

class map;}

map一般译为映射,映射指的是一个范畴内的事物与另一个范畴内事物的对映关系。

Page 21: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

4 . map 的能力和使用

map容器可以理解为是一个平衡二叉树实现的关联式容器。

namespace std {template < class Key,

class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> >

class map;}

1 ) Key:键值;2 ) Type:元素值;3 ) Traits:按什么数据类型来排序,默认为以键值的数据类型来排序;4 ) Allocator:内存模型,采用默认值。

Page 22: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

4 . map 的能力和使用

map即映射

一个范畴内的事物与另一个范畴内事物的对映关系。

在数据结构领域内:

一种数据类型与另一种数据类型的一一对应关系。

Page 23: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

4 . map 的能力和使用

map即映射 :一个范畴内的事物与另一个范畴内事物的对映关系。

在数据结构领域内:一种数据类型与另一种数据类型的一一对应关系。

1)可以把 set看作是一类特殊的 map,也就是当键值和元素值是同一对象时,就和set一样了;

2)对于键值不可以直接修改,要想实现修改的办法是先删除再插入;

3) map “内的元素是 键值 / ”元素值 成对( pair)插入的。

4 ) map在元素搜寻方面是通过对键值的搜寻实现的,所以提供了特殊的搜寻函数。

Page 24: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

4 . map 的能力和使用

map<string, float> coll;

// 运用 value_type插入coll.insert(map<string, float>::value_type("otta", 21.1));

// 运用 pair<>插入coll.insert(pair<string, float>("ottb", 22.2));

// 运用 make_pair()插入coll.insert(make_pair("ottc", 23.3));

Page 25: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

4 . map 的能力和使用

函数 功能

count(key) 返回“键值等于 key”的元素个数

find(key) 返回“键值等于 key”的第一个元素,找不到就返回 end()

lower_bound(key) 返回“键值为 key” 的元素的第一个可插入位置,也就是“键值>=key”的第一个元素位置

upper_bound(key) 返回“键值为 key” 的元素的最后一个可插入位置,也就是“键值>key”的第一个元素位置

equal_range(key) 返回“键值为 key”的元素的第一个可插入位置和最后一个可插入位置,也就是“键值 ==key”的元素区间

Page 26: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

9.2 STL 的使用9.2.2 STL 中容器的使用

4 . map 的能力和使用

map<int, int> m1;map<int, int>::const_iterator m1_AcIter, m1_RcIter;typedef pair<int, int> Int_Pair;// 成对插入元素m1.insert(Int_Pair(1, 10));m1.insert(Int_Pair(2, 20));m1.insert(Int_Pair(3, 30));m1_RcIter = m1.find(2);cout<< " 键值 2 映射的元素是 : "

<< m1_RcIter -> second << "." << endl;

Page 27: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

小结

本章主要讲解 STL 基础知识

标准模板库

常用的容器

Page 28: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

自测题

1 .以下那一个不是 vector的特点( )。A. 支持随机存取B. 在末端添加和删除元素,性能非常好C. 搜寻元素的性能非常好D. 容量是可配置的

2 .迭代器就是一个指向元素的指针。( )

Page 29: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

自测题

1 .以下那一个不是 vector的特点( C )。A. 支持随机存取B. 在末端添加和删除元素,性能非常好C. 搜寻元素的性能非常好D. 容量是可配置的

2 .迭代器就是一个指向元素的指针。( X )

Page 30: 网络游戏开发 -C++ 程序设计

第第 99 章 模板与章 模板与 STLSTL

课后作业

【作业 1 】 使用容器,保存一组整数,要求能随机存取,插入和删除操作方便。

【作业 2 】 使用map,保存一组整数和名字,输入名字,可以找到整数。