容器是储存其他对象的对象
1. vector
标准模板库vector是在编程过程中常用的容器,可以创建vector对象,将一个vector对象赋给另一个对象,使用[]符号来访问vector元素,要想使类成为通用的,将它设计为模板类,vector正是这样的类。下面是vector的函数原型:
1 | template<class T,class Allocator=allocator<T>> |
vector模板函数(特定算法)
函数名 | 说明 |
---|---|
Size() | 返回元素中元素数目 |
Swap() | 交换两个容器的内容 |
begin() | 返回一个指向容器中第一个元素的迭代器 |
end() | 返回一个表示超过容器尾的迭代器(迭代器是一个广义指针) |
push_back() | 将元素添加到矢量末尾 |
erase() | 删除矢量中给定区间的元素 |
insert() | 向矢量中插入元素,方法接受三个参数 |
声明一个迭代器1
vector<double>::iterator pd;
特定算法与通用算法
特定算法:指的是在整个容器家族中,大多数容器都包含自己特定的算法,这种算法只能用于本容器。
通用算法:指的是在在容器家族中共用的函数,这些函数在设计的时候单独做了封装,这是为了减少重复代码,真正体现OOP的理念,如果通用算法被包含在模板类当中,那么相同的算法将要重复写入所有模板类中。
下面是通用算法列表 1
for_each()函数能够遍历容器,函数接受三个参数,前两个参数指定访问的区间,第三个参数接受一个函数指针,将访问到的元素交给第三个参数处理。
for_each例子:1
for_each(book.begin(),book.end(),out);
1 | Random_shuffle()函数接受两个迭代器参数,并随机排列该区间的元素。 |
Random_shuffle例子:1
Random_shuffle(book.begin(),book.end());
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 | Priority_queue<int> pq1; |
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相似,只是一个键可以有多个值关联。