以下是根据《C++primer第5版》整理的C++顺序容器的使用。包括添加、删除、访问以及改变大小等操作。
1. 添加元素
表5-1 向顺序容器中添加元素 | |
添加操作会改变容器大小,故array不支持。 forward_list有独特的insert和emplace; forward_list不支持push_back和emplace_back; vector和string不支持push_front和emplace_front。 | |
c.push_back(t); c.emplace_back(argv); | 将值为t或是有argv创建的元素添加在容器c尾部,返回void |
c.push_front(t); c.emplace_front(argv); | 将值为t或是有argv创建的元素添加在容器c首部,返回void |
c.insert(p,t); c.emplace(p,argv); | 在迭代器p指向的元素之前插入一个元素,返回指向新添加元素的迭代器 |
c.insert(p,n,t); | 插入n个值为t的元素 |
c.insert(p,b,e); | 范围插入,b、e不能指向c中元素 |
c.insert(p,li); | 插入列表范围元素 |
表5-2 各个容器支持的操作 | |||||
| vector | string | forward_list | list | deque |
push_back | √ | √ | × | √ | √ |
emplace_back | √ | √ | × | √ | √ |
push_front | × | × | √ | √ | √ |
emplace_front | × | × | 特有 | √ | √ |
insert | √ | √ | 特有 | √ | √ |
2. 访问元素
访问容器前判定容器非空。
表6-1 顺序容器访问操作 | |
at和下标操作只适用于string、vector、deque和array; back不适用于forward_list; | |
c.back(); | 返回c中尾元素的引用,若c为空,则函数行为未定义 |
c.front(); | 返回c中首元素的引用,若c为空,则函数行为未定义 |
c[n]; | 返回c中下标为n的元素引用,若n>c.size(),则函数行为未定义 |
c.at(n); | 返回c中下标为n的元素引用,若n>c.size(),则抛出out_of_range异常 |
3. 删除元素
表7-1 (非array)顺序容器的 | |
删除操作会改变大小,故array不支持 forward_list有特殊版本的erase forward_list不支持pop_back vector、string不支持pop_front | |
c.pop_back(); | 删除尾元素,若为空,函数行为未定义。函数返回void。 |
c.pop_front(); | 删除首元素,若为空,函数行为未定义。函数返回void。 |
c.erase(p); | 删除迭代器指向的元素,返回指向被删元素之后的元素的迭代器;若p指向尾元素,则返回尾后迭代器;若p是尾后迭代器,则函数行为未定义。 |
c.erase(b,e); | 删除b、e指定范围元素,返回指向最后一个被删元素之后的元素的迭代器;若e为尾后迭代器,则返回尾后迭代器。 |
c.clear(); | 清空c,返回void。 |
4. forward_list操作
添加或删除元素会改变相关节点的值(链表的指针)。
表8-1 forward_list操作 | |
lst.before_begin(); | 返回首元前的不存在的元素的迭代器,此迭代器不能解引用;第二个函数返回的是一个常量迭代器 |
lst.cbefore_begin(); | |
lst.insert_after(p,t); | 在p后插入元素(或是范围),返回指向最后一个元素的迭代器 |
lst.insert_after(p,n,t); | |
lst_insert_after(p,b,e); | |
lst.insert_after(p,il); | |
emolace_after(p,argv); | 在p后插入argv元素,返回指向新元素的迭代器;若p为尾后迭代器,则函数行为未定义 |
lst.erase_after(p); | 删除p指向位置之后的元素,或是删除b到(但不包含)e的元素。返回一个指向被删元素之后元素的迭代器,若不存在这样的元素,则返回尾后迭代器,如果p指向尾元素或是尾后迭代器,则函数行为未定义。 |
lst.erase_after(b,e); |
5. vector增长方式
通过push_back成员函数递增元素个数至超出容器容积时,vector容积翻倍增长;
通过resize调用时,遵循如下规律:
①第一次,若容器为空,则变为1;否则翻倍;
②之后的每次增长,容量都会变为两次增长前的容积的两倍再加二。