C++中顺序容器vector、list和deque的使用方法

顺序容器类型:

|----------------|--------------|
| 顺序容器 ||
| vector | 支持快速随机访问 |
| list | 支持快速插入/删除 |
| deque | 双端队列 |
| 顺序容器适配器 ||
| stack | 后进先出(LIFO)堆栈 |
| queue | 先进先出(FIFO)队列 |
| priority_queue | 有优先级管理的队列 |

顺序容器内元素的类型约束:

|-------------------|
| 1. 元素类型必须支持赋值运算。 |
| 2. 元素类型的对象必须可以复制。 |

容器元素的初始化:

|------------|-----------------------------------------------------------|
| C<T> c; | 创建一个名为c的空容器。C是容器类型名,如vector,T是元素类型,如int或string。适用于所有容器。 |
| C c(c2); | 创建容器c2的副本c。c和c2必须具有相同的容器类型,病存放相同类型的元素。适用于所有容器。 |
| C c(b, e); | 创建c,其元素是迭代器b和e标本的范围内元素的副本。适用于所有容器。 |
| C c(n, t); | 用n个值为t的元素创建容器c,其中t必须是容器类型C的元素类型的值,或者是可转换为该类型的值。 只适用于顺序容器。 |
| C c(n); | 创建有n个值初始化元素的容器c。 只适用于顺序容器。 |

常用的迭代器运算:

|----------------|------------------------------------------------------------------------|
| *iter | 返回迭代器iter所指向的元素的引用 |
| iter->mem | 对iter进行解引用,获取指定元素中名为mem的成员。等效于(*iter).mem。 |
| ++iter | 给iter加1,使其指向容器里的下一个元素。 |
| Iter++ | 给iter加1,使其指向容器里的下一个元素。 |
| --iter | 给iter减1,使其指向容器里的上一个元素。 |
| Iter-- | 给iter减1,使其指向容器里的上一个元素。 |
| Iter1 == iter2 | 比较两个迭代器是否相等(或不等)。当两个迭代器指向同一个容器中的同一个元素,或者当它们都指向同一个容器的超出末端的下一位置,两个迭代器相等。 |
| Iter1 != iter2 | 比较两个迭代器是否相等(或不等)。当两个迭代器指向同一个容器中的同一个元素,或者当它们都指向同一个容器的超出末端的下一位置,两个迭代器相等。 |

vector和deque容器的迭代器提供的额外的运算(只适用于vector和deque容器):

|------------------|----------------------------------------------------------------------------------------------|
| Iter + n | 在迭代器上加(减)整数值n,将产生指向容器中前面(后面)第n个元素的迭代器。新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一位置。 |
| Iter - n | 在迭代器上加(减)整数值n,将产生指向容器中前面(后面)第n个元素的迭代器。新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一位置。 |
| Iter1 += iter2 | 这是迭代器加减法的复合赋值运算。将iter1加上减去iter2的运算结果赋给iter1。 |
| Iter1 -= iter2 | 这是迭代器加减法的复合赋值运算。将iter1加上减去iter2的运算结果赋给iter1。 |
| Iter1 - iter2 | 两个迭代器的减法,其运算结果加上右边的迭代器即得左边的迭代器。这两个迭代器必须指向同一个容器中的元素或超出末端的下一位置。 |
| >, >=, <, <= | 迭代器的关系运算符。当一个迭代器指向元素在容器中位于另一个迭代器指向的元素之前,则前一个迭代器小于后一个迭代器。关系操作符的两个迭代器必须指向同一个容器的元素或超出容器末端的下一位置。 |

容器定义的类型别名:

|------------------------|-----------------------------------|
| size_type | 无符号整形,足以存储容器类型的最大可能容器长度。 |
| iterator | 此容器类型的迭代器类型。 |
| const_iterator | 元素的只读迭代器类型。 |
| reverse_iterator | 按逆序寻址元素的迭代器。 |
| const_reverse_iterator | 元素的只读(不能写)逆序迭代器。 |
| difference_type | 足够存储两个迭代器差值的有符号整形,可为负数。 |
| value_type | 元素类型。 |
| reference | 元素的左值类型,是value_type&的同义词。 |
| const_reference | 元素的常量的左值类型,等效于const value_type&。 |

begin和end成员:

|------------|------------------------------|
| c.begin() | 返回一个迭代器,它指向容器c的第一个元素。 |
| c.end() | 返回一个迭代器,它指向容器c的最后一个元素的下一位置。 |
| c.rbegin() | 返回一个逆序迭代器,它指向容器c的最后一个元素。 |
| c.rend() | 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置。 |

上述的每个操作都有两个不同版本:一个const成员,另一个是非const成员。这些操作返回什么类型取决于容器是否为const。如果容器不是const,则这些操作返回iterator或reverse_iterator类型。如果容器是const,则其返回类型加上const_前缀,也就是const_iterator和const_reverse_iterator类型。

在顺序容器中添加元素的操作:

|-------------------|-----------------------------------------------|
| c.push_back(t) | 在容器c的尾部添加值为t的元素。返回void类型。 |
| c.push_front(t) | 在容器c的前端添加值为t的元素。返回void类型。 只适用于list和deque容器类型。 |
| c.insert(p, t) | 在迭代器p所指向的元素前面插入值为t的新元素。返回指向新添加元素的迭代器。 |
| c.insert(p, n, t) | 在迭代器p所指向的元素前面插入n个值为t的新元素。返回void类型。 |
| c.insert(p, b, e) | 在迭代器p所指向的元素前面插入有迭代器b和e标记的范围内的元素。返回void类型。 |

顺序容器大小操作:

|----------------|---------------------------------------------------------------|
| c.size() | 返回容器c中的元素个数。返回类型为c::size_type。 |
| c.max_size() | 返回容器c可容纳的最多元素个数。返回类型为c::size_type。 |
| c.empty() | 返回标记容器大小是否为0的布尔值。 |
| c.resize(n) | 调整容器c的长度大小,使其能容纳n个元素。如果n<c.size(),则删除多出来的元素。否则,添加采用值初始化的新元素。 |
| c.resize(n, t) | 调整容器c的长度大小,是其能容纳n个元素。所有新添加的元素值都为t。 |

访问容器内元素的操作:

|-----------|---------------------------------------------------------------|
| c.back() | 返回容器c的最后一个元素的引用。如果c为空,该操作未定义。 |
| c.front() | 返回容器c的第一个元素的引用。如果c为空,则该操作未定义。 |
| c[n] | 返回下标为n的元素的引用。如果n<0或n>=c.size(),则该操作未定义。 只适用于vector和deque容器。 |
| c.at(n) | 返回下标为n的元素的引用。如果下标越界,则该操作未定义。 只适用于vector和deque容器。 |

删除顺序容器内元素的操作:

|---------------|----------------------------------------------------------------------------------------------------------|
| c.erase(p) | 删除迭代器p所指向的元素。 返回一个迭代器,它指向被山粗元素后面的元素。如果p指向容器内的最后一个元素,则返回迭代器指向容器的超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,则该函数未定义。 |
| c.erase(b, e) | 删除迭代器b和e所标记的范围内所有的元素。 返回一个迭代器,它指向被删除元素段后面的元素。如果e本身就是指向超出末端的下一位置的迭代器,则返回迭代器也指向容器的超出末端的下一位置。 |
| c.clear() | 删除容器c内的所有元素。返回void。 |
| c.pop_back() | 删除容器c的最后一个元素。返回void。如果c为空容器,则该函数未定义。 |
| c.pop_front() | 删除容器c的第一个元素。返回void。如果c为空容器,则该函数未定义。 只适用于list或deque容器。 |

顺序容器的赋值操作:

|----------------|---------------------------------------------------------------------------------------|
| c1 = c2 | 删除容器c1的所有元素,然后将c2的元素复制给c1。c1和c2的类型(包括容器类型和元素类型)必须相同。 |
| c1.swap(c2) | 交换内容:调用完该函数后,c1中存放的是c2原来的元素,c2中存放的则是c1原来的元素。c1和c2的类型必须相同。该函数的执行速度通常要比将c2的元素复制到c1的操作快。 |
| c.assign(b, e) | 重新设置c的元素:将迭代器b和e标记的范围那日所有元素复制到c中。b和e必须不是指向c中元素的迭代器。 |
| c.assgin(n, t) | 将容器c重新设置为存储n个值为t 的元素。 |

vector容器的自增长:

|--------------|---------------|
| c.capacity() | 返回容器的容量大小。 |
| c.reserve(n) | 重新分配容器c的预留空间。 |

相关推荐
周周记笔记19 分钟前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅21 分钟前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~22 分钟前
《大数据之路1》笔记2:数据模型
大数据·笔记
ajassi200025 分钟前
linux C 语言开发 (八) 进程基础
linux·运维·服务器
优雅鹅31 分钟前
ARM、AArch64、amd64、x86_64、x86有什么区别?
arm开发·学习
..过云雨36 分钟前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
咸甜适中1 小时前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui
一又四分之一.1 小时前
高数基础知识(下)②
笔记
Gu_shiwww1 小时前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
matlab的学徒1 小时前
Web与Nginx网站服务(改)
linux·运维·前端·nginx·tomcat