vector | 可变长度数组。支持快速随机访问。在非尾部插入或删除元素速度很慢 |
deque | 双端队列。支持快速随机访问。快速在头或尾的插入和删除 |
list | 双向链表。只支持双向的顺序访问。可以在list的任何位置快速插入和删除 |
forward_list | 单向链表。只支持单向顺序访问。可在任何位置快速插入和删除 |
array | 定长数组。支持快速随机访问。不能添加或删除元素。 |
string | 专门用来保存字符的容器,类似vector。支持快速随机访问。快速在尾部的 插入和删除。 |
Type Aliases | |
---|---|
iterator | 容器类的迭代器类型 |
const_iterator | 该迭代器只能读,不能改变元素 |
size_type | 无符号整型,足够保存最大可能的容器类的大小 |
difference_type | 有符号整型,足够保存两个迭代器的距离 |
value_type | 元素类型 |
reference | 元素左值类型;与value_type&等价 |
const_reference | 元素的const左值类型(const value_type &) |
Construction | |
---|---|
C c; | 默认构造函数,空容器 |
C c1(c2); | 创建c1为c2的一个副本 |
C c(b, e); | 复制迭代器b和e范围内的元素(不适用于array) |
C c{a, b, c...}; | 列表初始化 |
Assignment and swap | |
---|---|
c1 = c2 | 用c2中的元素值代替c1中的元素 |
c1 = {a,b,c...} | 用列表中的元素代替c1中的元素 (不适用于array) |
a.swap(b) | 交换a和b中的元素 |
swap(a, b) | 等价于a.swap(b) |
Size | |
---|---|
c.size() | c中元素的个数(不适用于forward_list) |
c.max_size() | c最多可以保存的元素个数 |
c.empty() | 如果c为空,true |
Add/Remove Elements (not valid for array) |
Note: the interface to these operations varies by container type |
---|---|
c.insert(args) | 将args指代的元素插入c中 |
c.emplace(inits) | 使用inits构造一个c中的元素 |
c.erase(args) | 删除args指代的元素 |
c.clear() | 删除c中所有元素,返回void |
Equality and Relational Operators | |
---|---|
==, != | 所有容器都支持 |
<, <=, >, >= | 关系(非有序关系容器不支持) |
Obtain Iterators | |
---|---|
c.begin(), c.end() | Return iterator to the first, one past the last element in c |
c.cbegin(), c.cend() | Return const_iterator |
Additional Members of Reversible Containers | (not valid for forward_list) |
---|---|
reverse_iterator | Iterator that addresses elements in reverse order |
const_reverse_iterator | Reverse iterator that cannot write the elements |
c.rbegin(), c.rend() | Return iterator to the last, one past the first element in c |
c.crbegin(), c.crend() | Return const_reverse_iterator |
Defining and Initializing Containers | |
---|---|
C c; | 默认构造函数。如果C是array,则c中的元素是默认初始化,否则c为空 |
C c1(c2) | c1 is a copy of c2. c1 and c2 must have the same type (必须是相同类型的容器,且其中的元素类型也相同;对于array,长度也需要相同) |
C c{a,b,c...} | c is a copy of the elements in the initializer list.列表中元素的类型必须与C中元素的类型是相容的。对于array,列表中元素的个数必须小于或等于array的长度,缺少的部分用值初始化 |
C c={a,b,c...} | |
C c(b,e) | c is a copy of the elements in the range denoted by iterators b and e. 元素类型必须和C的元素类型相容。(不适用于array) |
Constructors that take a size are valid for sequential containers only |
(not including array) |
---|---|
C seq(n) | seq has n value-initialized elements; the constructor is explicit.(Not valid for string). |
C seq(n, t) | seq has n elements with value t. |
vector> vvi;
vector > vv_i; // 旧版本需要加一个空格
vector vs;
const vector c_vs;
auto beg = vs.begin(); // iterator
auto cbeg = c_vs.begin(); // const_iterator
auto cbeg1 = vs.cbegin(); // const_iterator
不带c的版本在内部是重载函数。一个const版本的和一个非const版本的。如果是const对象,则调用const版本,如果是非const对象则调用非const版本。
vector vs = {"hello", "world"};
list lcc = {"ok", "I", "want"};
deque ds(vs); // error
forward_list fs(lcc.begin(), lcc.end()); // ok
顺序容器的初始化:
vector vi(10, 1024); // 初始化为10个1024
list ls(10, "ok"); // 初始化为10个"ok"
forward_list fi(10); // 初始化为10个0
deque ds(10); // 初始化为10个空string
需要指出的是,只提供一个元素个数的构造函数,需要元素本身(如果是类类型)具有默认构造函数。
array a = {0, 1, 2 ,3}; // 其余元素为0
assign operations not valid for associative containers or array | |
---|---|
seq.assign(b,e) | Replaces elements in seq with those in the range denoted by iterators b and e. The iterators b and e must not refer to elements in seq. |
seq.assign(il) | Replaces the elements in seq with those in the initializer list il. |
seq.assign(n,t) | Replaces the elements in seq with n elements with value t. |
array arr1 = {1,2,3,4,5};
array arr2 = {0};
arr1 = arr2;
【注】赋值操作的等号左右两边的类型必须一致
list ls;
vector vcc;
ls = vcc; // error
ls.assign(vcc.cbegin(), vcc.cend()); // ok
c.push_back(t) c.emplace_back(args) |
在容器c的尾部,创建一个值为t的元素,或根据args构建一个元素。返回void |
c.push_front(t) c.emplace_front(args) |
在容器c的头部,创建一个值为t的元素,或根据args构建一个元素。返回void |
c.insert(p,t) c.emplace(p,args) |
在迭代器p所指元素的前面,插入一个值为t的元素,或根据args构建一个元素; 返回指向插入元素的迭代器 |
c.inesrt(p, n, t) | 在迭代器p所指元素的前面,插入n个值为t的元素;返回指向插入的第一个元素的迭代器, 如果n为0,返回p |
c.insert(p, b, e) | 在迭代器p所指元素的前面,插入迭代器指向范围为[b,e)的元素,b,e不能指向c本身。 返回指向插入的第一个元素的迭代器,如果范围为空,返回p |
c.insert(p, il) | il是包含元素值的括号序列。在迭代器p指向的元素前面插入该序列。返回指向插入的 第一个元素的迭代器,如果序列为空,返回p |
list ls;
vector vs = {"this", "is", "for", "test"};
ls.insert(ls.begin(), vs.end()-2, v.end());
ls.insert(ls.end(), {"love","coding"});
【c++11】
c.back() | 返回容器c的最后一个元素的引用。如果c为空,则结果未定义 |
c.front() | 返回容器c的第一个元素的引用。如果c为空,则结果未定义 |
c[n] | 返回下标n所在位置的元素。如果n>=c.size(),则结果为定义 |
c.at(n) | 返回下标n所在位置的元素。如果n超出范围,则抛出out_of_range 异常 |
c.pop_back() | 删除容器c的最后一个元素。如果c为空,则未定义。返回void |
c.pop_front() | 删除容器c的第一个元素。如果c为空,则未定义。返回void |
c.erase(p) | 删除迭代器p指向的元素,返回指向被删除元素后一位的迭代器。 |
c.erase(b,e) | 删除迭代器范围为[b,e)的元素,返回指向被删除元素后一位的迭代器。 |
c.clear() | 删除c的所有元素,返回void |
lst.before_begin() lst.cbefore_begin() |
指向链表开头前一个位置的迭代器,该迭代器指向的不是链表中的某个元素, 不能解引用。cbefore_begin()返回const_iterator |
lst.insert_after(p,t) lst.insert_after(p,n,t) lst.insert_after(p,b,e) lst.insert_after(p,il) |
在迭代器p所指元素的后面插入相应的元素。 |
emplace_after(p, args) | 在迭代器p所指元素的后面,根据args构造一个新的元素 |
lst.erase_after(p) lst.erase_after(b,e) |
删除在迭代器p所指的,或范围为[b,e)的元素。返回被删除元素的后继的迭代器。 |
c.resize(n) | 重新定义c的大小为n。如果n < c.size(),删除多余的元素。 否则添加新的元素(值初始化) |
c.resize(n,t) | 重新定义c的大小为n。增加的新元素值为t |
c.shrink_to_fit() | 将capacity()缩小到与size()相等 |
c.capacity() | 容器c的容量 |
c.reserve(n) | 使c的容量至少可以保存n个元素 |
#include
#include
using namespace std;
int main()
{
vector vi;
cout << "size: " << vi.size() << "; capacity: " << vi.capacity() << endl;
for(vector::size_type idx = 0; idx <= 50; ++idx) {
vi.push_back(idx);
cout << "size: " << vi.size() << "; capacity: " << vi.capacity() << endl;
}
return 0;
}
stack stk;
也可以指定用来实现的容器:
stack> stk_vec
实现适配器的容器是有限制的。所有的适配器都要求有添加和删除元素的能力。所以array不能使用。所以的适配器都要求在容器的末尾添加和删除元素,forward_list也不能使用。stack要求push_back, pop_back和back操作,可以用vector, deque, list实现。queue要求back, push_back, front和push_front操作,可以用list, deque实现。priority_queue除了要求front, push_back和pop_back 操作,还要求随机访问,所以可以用vector 或 deque实现。