容器操作笔记
vector 类定义了好几种构造函数(2.3.3 节),用来定义和初始化 vector 对象。表 3.4 列出了这些构造函数。
vector<T> v1; |
vector 保存类型为 T 对象。 默认构造函数 v1 为空。 |
vector<T> v2(v1); |
v2 是 v1 的一个副本。 |
vector<T> v3(n, i); |
v3 包含 n 个值为 i 的元素。 |
vector<T> v4(n); |
v4 含有值初始化的元素的 n 个副本。 |
vector 标准库提供了许多类似于 string 对象的操作,表 3.5 列出了几种最重要的 vector 操作。
v.empty() |
如果 v 为空,则返回 true,否则返回 false。 |
v.size() |
返回 v 中元素的个数。 |
v.push_back(t) |
在 v 的末尾增加一个值为 t 的元素。 |
v[n] |
返回 v 中位置为 n 的元素。 |
v1 = v2 |
把 v1 的元素替换为 v2 中元素的副本。 |
v1 == v2 |
Returns true if v1 and v2 are equal 如果 v1 与 v2 相等,则返回 true。 |
!=, <, <=, |
保持这些操作符惯有的含义。 |
除了默认构造函数,容器类型还提供其他的构造函数,使程序员可以指定元素初值,见表 9.2。
表 9.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 个值初始化(第 3.3.1 节)(value-initialized)元素的容器 c。 只适用于顺序容器 |
表 9.3. 常用迭代器运算
*iter |
返回迭代器 iter 所指向的元素的引用 |
iter->mem |
对 iter 进行解引用,获取指定元素中名为 mem 的成员。等效于 (*iter).mem |
++iter iter++ |
给 iter 加 1,使其指向容器里的下一个元素 |
--iter iter-- |
给 iter 减 1,使其指向容器里的前一个元素 |
iter1 == iter2 |
比较两个迭代器是否相等(或不等)。当两个迭代器指向同一个容器中的同一个元素,或者当它们都指向同一个容器的超出末端的下一位置时,两个迭代器相等 |
C++ 定义的容器类型中,只有 vector 和 deque 容器提供下面两种重要的运算集合:迭代器算术运算(第 3.4.1 节),以及使用除了 == 和 != 之外的关系操作符来比较两个迭代器(== 和 != 这两种关系运算适用于所有容器)。
表 9.4 总结了这些相关的操作符。
iter + n |
在迭代器上加(减)整数值 n,将产生指向容器中前面(后面)第 n 个元素的迭代器。新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一位置 |
iter1 += iter2 |
这里迭代器加减法的复合赋值运算:将 iter1 加上或减去 iter2 的运算结果赋给 iter1 |
iter1 - iter2 |
两个迭代器的减法,其运算结果加上右边的迭代器即得左边的迭代器。这两个迭代器必须指向同一个容器中的元素或超出容器末端的下一位置 只适用于vector和deque 容器 |
>, >=, <, <= |
迭代器的关系操作符。当一个迭代器指向的元素在容器中位于另一个迭代器指向的元素之前,则前一个迭代器小于后一个迭代器。关系操作符的两个迭代器必须指向同一个容器中的元素或超出容器末端的下一位置 只适用于vector和deque 容器 |
在前面的章节里,我们已经使用过三种由容器定义的类型:size_type、iterator 和 const_iterator。所有容器都提供这三种类型以及表 9.5 所列出的其他类型。
表 9.5. 容器定义的类型别名
size_type |
无符号整型,足以存储此容器类型的最大可能容器长度 |
iterator |
此容器类型的迭代器类型 |
const_iterator |
元素的只读迭代器类型 |
reverse_iterator |
按逆序寻址元素的迭代器 |
const_reverse_iterator |
元素的只读(不能写)逆序迭代器 |
difference_type |
足够存储两个迭代器差值的有符号整型,可为负数 |
value_type |
元素类型 |
reference |
元素的左值类型,是 value_type& 的同义词 |
const_reference |
元素的常量左值类型,等效于 const value_type& |
begin 和 end 操作产生指向容器内第一个元素和最后一个元素的下一位置的迭代器,如表 9.6 所示。这两个迭代器通常用于标记包含容器中所有元素的迭代器范围。
表 9.6. 容器的 begin 和 end 操作
c.begin() |
返回一个迭代器,它指向容器 c 的第一个元素 |
c.end() |
返回一个迭代器,它指向容器 c 的最后一个元素的下一位置 |
c.rbegin() |
返回一个逆序迭代器,它指向容器 c 的最后一个元素 |
c.rend() |
返回一个逆序迭代器,它指向容器 c 的第一个元素前面的位置 |
表 9.7 在顺序容器中添加元素的操作
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 类型 |
表 9.8. 顺序容器的大小操作
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 |
表 9.9. 访问顺序容器内元素的操作
c.back() |
返回容器 c 的最后一个元素的引用。如果 c 为空,则该操作未定义 |
c.front() |
返回容器 c 的第一个元素的引用。如果 c 为空,则该操作未定义 |
c[n] |
返回下标为 n 的元素的引用 如果 n <0 或 n >= c.size(),则该操作未定义 只适用于 vector 和 deque 容器 |
c.at(n) |
返回下标为 n 的元素的引用。如果下标越界,则该操作未定义 只适用于 vector 和 deque 容器 |
表 9.10. 删除顺序容器内元素的操作
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 容器 |
表 9.11. 顺序容器的赋值操作
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.assign(n,t) |
将容器 c 重新设置为存储 n 个值为 t 的元素 |
表 9.22. 适配器通用的操作和类型
size_type |
一种类型,足以存储此适配器类型最大对象的长度 |
value_type |
元素类型 |
container_type |
基础容器的类型,适配器在此容器类型上实现 |
A a; |
创建一个新空适配器,命名为 a |
A a(c); |
创建一个名为 a 的新适配器,初始化为容器 c 的副本 |
Relational Operators 关系操作符 |
所有适配器都支持全部关系操作符:==、 !=、 <、 <=、 >、 >= |