目录
简介:容器就是一些特定类型对象的集合,顺序容器就是一种元素的顺序和它的值无关,只是将元素与元素加入容器时的位置相对应的容器类别。
1. 容器类型
容器 | 类型 | 优 | 劣 |
vector | 可变大小数组 | 快速随机访问,尾部插入、删除元素很快,顺序存储,计算地址速度很快 | 除尾部外其它位置插入、删除元素很慢 |
deque | 双端队列 | 快速随机访问,头尾部插入、删除元素很快 | 除尾部外其它位置插入、删除元素很慢 |
list | 双向链表 | 双向顺序访问,任意位置插入、删除元素很快 | 随机访问,内存开销大 |
forward_list | 单链表 | 单向顺序访问,任意位置插入、删除元素很快 | 随机访问,内存开销大 |
array | 固定大小数组 | 随机快速访问 | 不允许插入和删除元素,顺序存储,计算地址速度很快 |
string | 字符串数组 | 快速随机访问,尾部插入、删除元素很快,顺序存储,计算地址速度很快 | 除尾部外其它位置插入、删除元素很慢 |
2. 容器操作(除标注外,其余操作也同样适用于关联容器)
2.1 类型别名
类型别名:vector<int>::reference | 含义 |
iterator | 迭代器 |
const_iterator | 只能读取元素,不能修改元素的迭代器 |
size_type | 无符号整型,保存容器的最大容量值 |
difference_type | 带符号整型,两个迭代器之间的距离 |
value_type | 容器的元素类型 |
reference | 类似于:value_type&,容器元素类型的引用 |
const_reference | 类似于:const value_type&元素的const左值类型 |
2.2 容器定义和初始化
容器定义和初始化 | 含义 |
C c; | 默认构造函数 |
C c1( c2 ); C c1 = c2; |
把c2拷贝为c1,c1和c2必须容器类型相同、元素类型也相同,如果C是array还要求大小相同。 |
C c( b , e ); | 用迭代器b和e之间的元素构造c的元素,b和e指向的元素类型必须与C的元素类型相容(不是相同,就是可以转换的意思),array不支持 |
C c{ a , b , c , ...}; C c = { a , b , c , ...}; |
列表初始化,a,b,c分别初始化容器c,列表内的元素类型必须与C的元素类型相容(不是相同,就是可以转换的意思),array不支持 |
C c( n ); | c中包含有n个元素,这些元素进行了值初始化,是explicit的,只适用于顺序容器,且array不支持 |
C c( n , t ); | c中包含有n个元素,每个元素用值 t 来进行初始化,只适用于顺序容器,且array不支持 |
注意:最后两种,传入大小参数的初始化,如果顺序容器的元素是不提供默认构造函数的类型,那么要显示的写上初始化值。
vector<string> ive(10,"hi"); //这里string是有默认构造函数的,举个例子
2.3 赋值与swap、assign替换
赋值与swap | 含义 |
c1 = c2; | 将c1替换为c2 |
c1 = { a , b , c ,...... }; | 将c1中的全部元素用列表里的全部元素替换 |
a.swap(b); | 交换a与b的元素 |
swap( a , b ); | 交换a与b的元素 |
a.assign( il ); | 将a中的元素替换为初始化列表il中的元素,只适用于顺序容器,且array不支持 |
a.assign( n , t ); | 将a中的元素替换为n个值为t的元素,只适用于顺序容器,且array不支持 |
注意:
1.赋值相关运算会导致指向左边容器内部的迭代器、引用、指针全部失效,而swap不会。(array和string除外,string调用swap也会失效)
2.swap效率很高,是因为实际上元素本身并没有交换,swap只是交换了两个容器的内部数据结构,但array除外,array会进行元素的交换,所以对array的swap操作时间和array的元素数量有关。
3.swap的交换,虽然不会导致迭代器、引用、指针失效,且它们指向的元素不变,但会使他们指向的容器变化。如:iter在swap之前指向svec1[3],在swap之后则会指向svec2[3]。
2.4 大小
大小 | 含义 |
c.size(); | c中元素的数目,forward_list容器不支持此操作 |
c.max_size(); | c可以保存的最大元素数目 |
c.empty(); | c中有元素,返回false,c中没元素,返回true |
c.length(); | string独有,和size()的是一样的 |
2.5 添加/删除元素(array不支持)
注:不同的容器,操作的接口不一样。
添加/删除元素(ar |