• LeekinDeveloper@Gmail.com

C++ 标准模板库


容器是储存其他对象的对象

1. vector

标准模板库vector是在编程过程中常用的容器,可以创建vector对象,将一个vector对象赋给另一个对象,使用[]符号来访问vector元素,要想使类成为通用的,将它设计为模板类,vector正是这样的类。下面是vector的函数原型:

1
2
template<class T,class Allocator=allocator<T>>
class vector{...........} //其中,Allocator指明使用的内存分配方式,如果省略该值,默认将使用allocator<T>,即new和delete的方式来分配内存

vector模板函数(特定算法)

函数名 说明
Size() 返回元素中元素数目
Swap() 交换两个容器的内容
begin() 返回一个指向容器中第一个元素的迭代器
end() 返回一个表示超过容器尾的迭代器(迭代器是一个广义指针)
push_back() 将元素添加到矢量末尾
erase() 删除矢量中给定区间的元素
insert() 向矢量中插入元素,方法接受三个参数

声明一个迭代器

1
vector<double>::iterator pd;

特定算法与通用算法

特定算法:指的是在整个容器家族中,大多数容器都包含自己特定的算法,这种算法只能用于本容器。

通用算法:指的是在在容器家族中共用的函数,这些函数在设计的时候单独做了封装,这是为了减少重复代码,真正体现OOP的理念,如果通用算法被包含在模板类当中,那么相同的算法将要重复写入所有模板类中。

下面是通用算法列表

for_each
1
for_each()函数能够遍历容器,函数接受三个参数,前两个参数指定访问的区间,第三个参数接受一个函数指针,将访问到的元素交给第三个参数处理。

for_each例子:
1
for_each(book.begin(),book.end(),out);

Random_shuffle
1
Random_shuffle()函数接受两个迭代器参数,并随机排列该区间的元素。

Random_shuffle例子:

1
Random_shuffle(book.begin(),book.end());

sort()
1
sort()函数有两个版本,1.sort()接受两个参数,指定要进行排序的区间,并对其进行排序操作,排序时使用内置的<运算符进行比较。2.第二个版本需要我们指定排序的规则,即在类中定义operator<()函数,当我们使用sort()函数时,就使用我们指定的函数来进行排序操作。

2. 迭代器类型

  • 输入迭代器:能够从容器中读入值,不会修改容器中的值。

  • 输出迭代器:能够向容器中写入值,不能读取值。

  • 正向迭代器: 即可以读取值也可以修改值。

  • 双向迭代器: 双向迭代器支持正向迭代器的所有特性,同时支持两种递减运算符(前坠与后缀)。

  • 随机访问迭代器:随机访问迭代器具备双向迭代器的所有特性,它能够直接跳到容器中的任何一个元素,同时添加对元素的随机访问操作功能。

3.所有容器列表


deque list queue Priority_queue stack vector map multimap set multiset bitset

C++11新增: forward_list unordered_map unordered_multimap unordered_set unordered_multiset


4. deque:

双端队列,类似于vector容器,支持随机访问,与vector的主要区别:deque对象的开始位置插入和删除元素的时间是固定的,而vector是线性时间,适用于多数操作发生在序列的起始和结尾处,则考虑使用deque。

5.list

双向链表,除了第一个和最后一个元素外,每个元素都与前后的元素相链接,可以双向遍历链表,与vector不同的是:list不支持数组表示法和随机访问。与矢量迭代器不同,从容器中插入或删除元素之后,链表迭代器指向的元素不变。unique()方法删除重复的元素.

6. forward_list

单链表,每个节点都只链接到下一个节点,而没有链接到前一个节点,forward_list只需要正向迭代器,而不需要双向迭代器,forward_list是不可反转的容器,相比于list,forward_list更简单,更紧凑,但功能更少。

7. queue

queue是一个适配器,如:Ostream_iterator模板是一个适配器,让输出流能够使用迭代器接口;queue模板让底层类展示典型的队列接口,queue的限制比deque的多,它不允许随机访问列队元素,不引许遍历队列,它把使用限制在定义列队的基本操作之上,可以将元素添加到队尾,从队首删除元素,查看队首和队尾的值,检查元素数目和测试队列是否为空。

queue函数列表

函数名 说明
empty() 检查队列是否为空
Size() 返回队列的数目
front() 返回队尾元素的引用
push(const T&x) 在队尾插入x
pop() 删除队首元素

8. Priority_queue

Priority_queue在queue头文件中,是另一个适配器,他支持的操作与queue相同,区别在于Priority_queue中最大的元素被移到队首,内部区别:Priority_queue的底层类是vector,可以修改用于确定哪个元素被放到队首的比较方法,方法是提供一个可选的构造函数:

1
2
Priority_queue<int> pq1;
Priority_queue<int> pq2(greater<int>);//greater<>()是一个预定义函数对象。

9. stack

与queue相同,stack也是一个适配器类,他给底层提供了典型的栈接口,stack的限制比vector更多,他不仅不允许随机访问栈元素,甚至不允许遍历栈,他把使用限制在定义栈的基本操作上,既可以将压入推到栈顶,从栈顶弹出元素,查看栈顶的值,检查元素数目和测试栈是否为空。

stack 函数

函数名 说明
bool empty() const 检查栈是否为空
Size_type Size() const 返回栈的大小
T& top() 返回栈顶元素引用
void push(const T &x) 在栈顶部插入x
void pop() 删除栈顶元素

10.array (C++11)

array并不是STL容器,因为其长度是固定的。因此,array没有定义调整容器大小的操作,如: push_back()和insert(),但定义如operator和at(),可将很多标准STL算法用于array对象,如copy()和for_each()

11. set

set是一个关联容器,关联容器是对容器的一个改进,它将值与键关联在一起,并使用键来查找值。关联容器的优点在于提供对元素的快速访问,不能指定新元素的插入位置,关联容器通常是树的数据结构,相对于链表,树的查找速度更快。set是最简单的关联容器,其值类型与键相同,键是唯一的,这意味着集合中不会有多个相同的元素,对于set来说,值就是键。例如:4-2,1-5,8-8

12. multiset

multiset类似于set,只是可能有多个值的键相同,例如:4-2,5-2,6-3,8-3。

13. map

map中,键与值的类型不同,键是唯一的,每个键对应一个值,如:1-CPP,2-JAVA,3-JAVASCRIPT

14.multimap

multimap与map相似,只是一个键可以有多个值关联。