一、引言
C++标准库提供了几种顺序容器,所有顺序容器都提供了快速顺序访问元素的能力,但是,它们各自有不同的特性。新标准库的容器的性能有很大的提升,从某种程度讲,应该使用标准库容器,而不是原始的数据结构。
vector | 可变大小数组,比较常用 |
deque | 双端队列 |
list | 双向链表 |
forward_list | 单向链表 |
array | 固定大小数组 |
string | 保存字符串 |
二、容器的初始化
假定C代表一种容器类型
C c; | 默认构造函数。如果是array,则按默认方式初始化,否则为空。 |
C c1(c2); | 构造c2的拷贝c1。容器、元素类型必须相同,array的大小也要相同。 |
C c(b, e); |
将迭代器b和e之间的元素拷贝到c。array不支持。 |
C c{a, b, c, ....} | 列表初始化c。对于array,元素数目小于等于array大小,遗漏元素会被初始化。 |
C c(n) | c包含n个元素,并进行初始化。此函数是explicit的。string不适用。 |
C c(n, t) | c包含n个初始化值为t的元素。 |
vector<int> vec(6, 2); //一个vector类型容器,元素为6个2
array<int, 5> arr(3, 2); //一个array类型容器,3个2,剩余的进行初始化
三、顺序容器操作
(1)添加元素(array不适用,因为数目会发生改变)
c.push_back(t) | 在c末尾添加元素t |
c.push_front(t) | 在c头部添加元素t |
c.insert(p, t) | 在迭代器p前添加元素t |
c.insert(p, n, t) | 在迭代器p前添加n个元素t |
c.insert(p, b, e) | 在迭代器p前插入迭代器b和e之间的元素 |
c.insert(p, il) | 在迭代器p之前插入il中的元素,il是一个元素值列表 |
(2)访问元素
c.back() | 返回c中尾元素的引用 |
c.front() | 返回c中头元素的引用 |
c[n] | 返回下标n的元素的引用。list不适用 |
c.ar(n) | 返回下标n的元素的引用。 |
(3)删除元素(array不适用,因为数目会发生改变)
c.pop_back() | 删除 c中尾元素 |
c.pop_front() | 删除c中头元素 |
c.erase(p) | 删除迭代器p所指元素 |
c.erase(b, e) | 删除迭代器b、e之间的元素 |
c.clear() | 删除c中所有元素 |
注意,该种情况下,删除deque除头尾外任何元素,都会使所有迭代器、引用和指针失效;vector、string中删除点以后的迭代器、引用和指针会失效。
(4)改变容器大小
可以使用c.resize(n),调整容器大小为n个元素,多余的会被丢弃,新元素会被初始化 //c.resize(n,t) t为默认初始值