顺序容器 | |
vector | 支持快速随机访问 |
list | 支持快速插入/删除 |
deque | 双端队列 |
顺序容器适配器 | |
stack | 后进先出(LIFO)栈 |
queue | 先进先出(FIFO)栈 |
priority_queue | 有优先级管理的队列 |
容器元素类型必须满足条件:1.支持赋值运算,2.对象可以赋值
因为容器受容器元素类型的约束,所以可定义元素是是容器类型的容器。
迭代器为标准库容器类型所提供的运算
*iter | 返回迭代器iter所指向的元素的引用 |
iter->mem | 对iter进行解引用,获取指定元素中名为mem的成员。 |
++iter | 给iter加1,使其指向容器里的下一个元素 |
iter++ | |
--iter | 给iter减1,使其指向容器里的前一个元素 |
iter-- | |
iter1 == iter2 | 比较两个迭代器是否相等(或不等)。当两个迭代器指向同一个容器中的同一 |
iter1 != iter2 | 个元素,或者当他们都指向同一个容器超出末端的下一位置时,两迭代器相等 |
对形成迭代器范围的迭代器的要求:
1.它们指向同一个容器中的元素或超出末端的下一位置
2.如果这两个迭代器不相等,则对first反复做自增运算必须能够达到last
使迭代器失效的容器操作:一些容器操作会修改容器的内在状态或移动容器内的元素。这样的操作会使指向被移动元素的迭代器失效,也可能同时使其他迭代器失效。可能会导致与悬垂指针相同的问题,导致运行错误而检查不出来。
容器定义的类型别名
size_type | 无符号整型,足以存储此容器类型的最大可能容器长度 |
iterator | 此容器类型的迭代器类型 |
const_iterator | 元素的只读迭代器类型 |
reverse_iterator | 按逆序寻址元素的迭代器 |
const_reverse_iterator | 元素的只读(不能写)逆序迭代器 |
difference_type | 足够存储两个迭代器差值的有符号整型,可为负数 |
value_type | 元素类型 |
reference | 元素的左值类型,是value_type&的同义词 |
const_reference | 元素的常量左值类型,等效于 const value_type& |
在顺序容器中添加元素的操作
c.push_back(t) | 在容器c的尾部添加值为t的元素。返回void类型 |
c.push_front(t) | 在容器c的前端添加值为t的元素。返回void类型 |
以上只适用于list和deque容器类型 |
|
c.insert(p,t) | 在迭代器p所指向的元素前面插入值为t的新元素。返回指向新添加元素的迭代器 |
c.insert(p,n,t) | 在迭代器p所指向的元素前面插入n个值为t的新元素,返回void类型 |
c.insert(p,b,e) | 在迭代器p所指向的元素前面插入由迭代器b和e标记的范围内的元素,返回void |
顺序容器的大小可以通过resize调整,可以只指定元素个数,也可以同时指定初始值
访问顺序容器内元素的操作
c.back() | 返回容器c的最后一个元素的引用。如果c为空,则该操作未定义 |
c.front() | 返回容器c的第一个元素的引用。如果c为空,则该操作未定义 |
c[n] | 返回下标为n的元素的引用,如果n<0或n>=c.size(),则该操作未定义 只适用于vector和deque容器 |
c.at(n) | 返回下标为n的元素的引用。如果下标越界,则该操作未定义 只适用于vector和deque容器 |
c.assign(b,e)可以重新设置c的元素,将迭代器b和e标记的范围内所有的元素复制到c中
c.assign(n,t)将c设置为存储n个t的容器
assign操作首先删除容器中所有的元素,然后将其参数指定的新元素插入到容器中。
vector容器是连续的存储空间,而list和deque容器是不连续的。但是vector容器有预留了额外的存储区用于存放新添加的元素,自增长的速率很高
capacity操作获取在容器需要分配更多的存储空间之前能够存储的元素总数
reserve操作则告诉vector容器应该预留多少个元素的存储空间
如何选择容器:list表示不连续的内存区域,可以高效地插入或删除,vector容器是连续的存储空间,deque容器有比较复杂的数据结构,从两端插入或删除都非常快,在中间插入或删除代价更高。
一般来说,除非特殊要求,vector都是最好的容器
容器选择法则:
1.如果程序要求随机访问元素,那么应该选择vector或deque容器
2.如果程序必须在容器的中间位置插入或删除元素,则应采用list容器
3.如果程序不是在容器的中间位置,而是在首部或尾部插入或删除元素,则应采用deque容器
4.如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,使其适合顺序访问,让后将其复制到vector容器。
string类型特有的几种操作(容器类型不支持)
substr函数:可在指定string对象中检索需要的子串,可以给substr传递查找的起点和一个计数器
append和replace函数:append串接,后面可以使用迭代器,replace后面可以使用迭代器标记删除的数据,但是不可以使用迭代器传入数据
string类型的查找操作:(args可以定义为一个字符串等)
s.find(args) | 在s中查找args的第一次出现 |
s.rfind(args) | 在s中查找args的最后一次出现 |
s.find_first_of(args) | 在s中查找args的任意字符的第一次出现 |
s.find_last_of(args) | 在s中查找args的任意字符的最后一次出现 |
s.find_first_not_of(args) | 在s中查找第一个不属于args的字符 |
s.find_last_not_of(args) | 在s中查找最后一个不属于args的字符 |
string类型的比较操作:
s.compare(s2) | 比较s和s2 |
s.compare(pos1,n1,s2) | 让s中从pos下标位置开始的n1个字符与n2做比较 |
s.compare(pos1,n1,s2,pos2,n2) | 让s中从pos1下标位置开始的n1个字符与s2中从pos2下标位置开始的n2个字符做比较 |
s.compare(cp) | 比较s和cp所指向的以空字符串结束的字符串 |
s.compare(pos1,n1,cp) | 让s中从pos1下标位置开始的n1个字符与cp所指向的字符串做比较 |
s.compare(pos1,n1,cp,n2) | 让s中从pos1下标位置开始的n1个字符与cp所指向的前n2字符串做比较 |
容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。