|
G.3 序列容器的其他成员(1)
模板类vector、forward_list、list、deque和array都是序列容器,它们都前面列出的方法,但forward_list不是可反转的,不支持表G.3所示的方法。序列容器以线性顺序存储一组类型相同的值。如果序列包含的元素数是固定的,通常选择使用array;否则,应首先考虑使用vector,它让array的随机存取功能以及添加和删除元素的功能于一身。然而,如果经常需要在序列中间添加元素,应考虑使用list或forward_list。如果添加和删除操作主要是在序列两端进行的,应考虑使用deque。
array对象的长度是固定的,因此无法使用众多序列方法。表G.5列出除array外的序列容器可用的其他方法(forward_list的resize( )方法的定义稍有不同)。同样,其中X是容器类型,如vector<int>;T是存储在容器中的类型,如int;a是类型为X的值;t是类型为x::value_type的左值或const右值;i和j是输入迭代器;[i, j]是有效的区间;il是类型为initilizer_list<value_type>的对象;p是指向a的有效const迭代器;q是可解除引用的有效const迭代器;[q1, q2]是有效的const迭代器区间;n是x::size_type类型的整数;Args是模板参数包,而args是形式为Args&&的函数参数包。
表G.5为序列容器定义的其他操作
|
操 作< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
描 述 |
|
X(n, t) |
创建一个序列容器,它包含t的n个拷贝 |
|
X a(n, t) |
创建一个名为a的序列容器,它包含t的n个拷贝 |
|
X(i, j) |
使用区间[i, j] 内的值创建一个序列容器 |
|
X a(i, j) |
使用区间[i, j) 内的值创建一个名为a的序列容器 |
|
X(il) |
创建一个序列容器,并将其初始化为il的内容 |
|
a = il; |
将il的值复制到a中 |
|
a.emplace(p, args); |
在p前面插入一个类型为T的对象,创建该对象时
使用与args封装的参数匹配的构造函数 |
|
a.insert(p, t) |
在p之前插入t的拷贝,并返回指向该拷贝的迭
代器。T的默认值为T( ),即在没有显式初始化时,
用于T类型的值 |
|
a.insert(p, rv) |
在p之前插入rv的拷贝,并返回指向该拷贝的迭
代器;可能使用移动语义 |
|
a.insert(p, n, t) |
在p之前插入t的n个拷贝 |
|
a.insert(p, i, j) |
在p之前插入[i, j)区间内元素的拷贝 |
|
a.insert(p, il) |
等价于a.insert(p, il.begin( ), il.end( )) |
|
a.resize(n) |
如果n > a.size( ),则在a.end( )之前插入
n - a.size( )个元素;用于新元素的值为没有
显式初始化时,用于T类型的值;如果
n < a.size( ),则删除第n个元素之后的所有元素 |
|
a.resize(n, t) |
如果n > a.size( ),则在a.end( )之前插入t的
n - a.size( )个拷贝;如果n<a.size( ),则删除
第n个元素之后的所有元素 |
|
a.assign(i, j) |
使用区间[i,j)内的元素拷贝替换a当前的内容 |
|
a.assign(n, t) |
使用t的n个拷贝替换a的当前内容。t的默
认值为T( ),即在没有显式初始化时,用于T类型的值 |
|
a.assign(il) |
等价于a.assign(il.begin( ), il.end( )) |
|
a.erase(q) |
删除q指向的元素;返回一个指向q后面的元素的迭代器 |
|
a.erase(q1, q2) |
删除区间[q1, q2]内的元素;返回一个迭代器,
该迭代器指向q2原来指向的元素 |
|
a.clear( ) |
与erase(a.begin( ), a.end( )) 等效 |
|
a.front( ) |
返回*a.begin( )(第一个元素) |
表G.6列出了一些序列类(vector、forward_list、list和deque)都有的方法。
表G.6为某些序列定义的操作
|
操 作 |
描 述 |
容 器 |
|
a.back( ) |
返回*a.end( )(最后一个元素) |
vector、list、deque |
|
a.push_back(t) |
将t插入到a.end( )前面 |
vector、list、deque |
|
a.push_back(rv) |
将rv插入到a.end( )前面;
可能使用移动语义 |
vector、list、deque |
|
a.pop_back( ) |
删除最后一个元素 |
vector、list、deque |
|
a.emplace_back(args) |
追加一个类型为T的对象,
创建该对象时使用与args封
装的参数匹配的构造函数 |
vector、list、deque |
|
a.push_front(t) |
将t的拷贝插入到第一个元素前面 |
forward_list、list、deque |
|
a.push_front(rv) |
将rv的拷贝插入到第一个元素
前面;可能使用移动语义 |
forward_list、list、deque |
|
a.emplace_front( ) |
在最前面插入一个类型为T
的对象,创建该对象时使用与args
封装的参数匹配的构造函数 |
forward_list、list、deque |
|
a.pop_front( ) |
删除第一个元素 |
forward_list、list |
|
a[n] |
返回*(a.begin( )+ n) |
vector、deque、array |
|
a.at(n) |
返回*(a.begin( )+ n);如果n>a.size,
则引发out_of_range异常 |
vector、deque、array |
|