当前位置:嗨网首页>书籍在线阅读

06-序列容器的其他成员

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

G.3 序列容器的其他成员

模板类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;T是存储在容器中的类型,如int;a是类型为X的值;t是类型为x::value_type的左值或const右值;i和j是输入迭代器;[i, j]是有效的区间;il是类型为initilizer_list的对象;p是指向a的有效const迭代器;q是可解除引用的有效const迭代器;[q1, q2]是有效的const迭代器区间;n是x::size_type类型的整数;Args是模板参数包,而args是形式为Args&&的函数参数包。

表G.5 为序列容器定义的其他操作

| 操作 | 描述 | | :----- | :----- | :----- | :----- | | 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 |

模板vector还包含表G.7列出的方法。其中,a是vector容器,n是x::size_type型整数。

表G.7 vector的其他操作

| 操作 | 描述 | | :----- | :----- | :----- | :----- | | a.capacity() | 返回在不要求重新分配内存的情况下,矢量能存储的元素总量 | | a.reserve(n) | 提醒a对象:至少需要存储n个元素的内存。调用该方法后,容量至少为n个元素。如果n大于当前的容量,则需要重新分配内存。如果n大于a.max_size(),该方法将引发length_error异常 |

模板list还包含表G.8列出的方法。其中,a和b是list容器;T是存储在链表中的类型,如int;t是类型为T的值;i和j是输入迭代器;q2和p是迭代器;q和q1是可解除引用的迭代器;n是x::size_type型整数。该表使用了标准的STL表示法[i, j),这指的是从i到j(不包括j)的区间。

表G.8 list的其他操作

| 方法 | 描述 | | :----- | :----- | :----- | :----- | | a.splice(p, b) | 将链表b的内容移到链表a中,并将它们插在p之前 | | a.splice(p, b, i) | 将i指向的链表b中的元素移到链表a的p位置之前 | | a.splice(p, b, i, j) | 将链表b中[i,j)区间内的元素移到链表a的p位置之前 | | a.remove(const T& t) | 删除链表a中值为t的所有元素 | | a.remove_if(Predicate pred) | 如果i是指向链表a中元素的迭代器,则删除pred(i)为true的所有值(Predicate是布尔值函数或函数对象,参见第15章) | | a.unique() | 删除连续的相同元素组中除第一个元素之外的所有元素 | | a.unique(BinaryPredicate bin_pred) | 删除连续的bin_pred(i, *(i - 1))为true的元素组中除第一个元素之外的所有元素(BinaryPredicate是布尔值函数或函数对象,参见第15章) | | a.merge(b) | 使用为值类型定义的<运算符,将链表b与链表a的内容合并。如果链表a的某个元素与链表b的某个元素相同,则a中的元素将放在前面。合并后,链表b为空 | | a.merge(b, Compare comp) | 使用comp函数或函数对象将链表b与链表a的内容合并。如果链表a的某个元素与链表b的某个元素相同,则链表a中的元素将放在前面。合并后,链表b为空 | | a.sort() | 使用<运算符对链表a进行排序 | | a.sort(Compare comp) | 使用comp函数或函数对象对链表a进行排序 | | a.reverse() | 将链表a中的元素顺序反转 |

forward_list的操作与此类似,但由于模板类forward_list的迭代器不能后移,有些方法必须调整。因此,用insert_after()、erase_after ()和splice_after()替代了insert()、erase()和splice(),这些方法都对迭代器后面而不是前面的元素进行操作。