类别:容器 | 组件类型:概念 |
X | 序列模型的类型 |
a, b | 类型为的对象X |
T | 的取值类型X |
t | 类型为的对象T |
p, q | 类型为的对象X::iterator |
n | 可转换为类型为的对象X::size_type |
如果a是序列,则[p, q)是a中的有效范围,如果p和q是a中的有效迭代器a并且如果q可以从p.
名称 | 表达式 | 类型要求 | 返回类型 |
---|---|---|---|
填充构造函数 | X(n, t) | X | |
填充构造函数 | X a(n, t); | ||
默认填充构造函数 | X(n) | T是默认可构造。 | X |
默认填充构造函数 | X a(n); | T是默认可构造。 | |
范围构造函数 | X(i, j) | i和j是输入迭代器,其值类型可转换为T [1] | X |
范围构造函数 | X a(i, j); | i和j是输入迭代器,其值类型可转换为T [1] | |
首元素 | a.front() | 引用如果a是可变的,常量引用否则。 | |
插入 | a.insert(p, t) | X::iterator | |
填充插入 | a.insert(p, n, t) | a是可变的 | void |
范围插入 | a.insert(p, i, j) | i和j是输入迭代器,其值类型可转换为T [1]. a是可变的 | void |
擦除 | a.erase(p) | a是可变的 | 迭代器 |
范围擦除 | a.erase(p,q) | a是可变的 | 迭代器 |
清空 | a.clear() | a是可变的 | void |
调整大小 | a.resize(n, t) | a是可变的 | void |
调整大小 | a.resize(n) | a是可变的 | void |
名称 | 表达式 | 前提条件 | 语义 | 后置条件 |
---|---|---|---|---|
填充构造函数 | X(n, t) | n >= 0 | 创建一个包含n的t | size() == n个副本的序列。每个元素都是t. |
填充构造函数 | X a(n, t); | n >= 0 | 创建一个包含n的t | a.size() == n的副本。序列的每个元素a都是t. |
默认填充构造函数 | X(n) | n >= 0 | 创建一个包含n个初始化为默认值的元素的序列。 | size() == n个副本的序列。每个元素都是T(). |
默认填充构造函数 | X a(n, t); | n >= 0 | 创建一个包含n个初始化为默认值的元素的序列。 | a.size() == n的副本。序列的每个元素a都是T(). |
默认构造函数 | X a;或X() | 等价于X(0). | size() == 0. | |
范围构造函数 | X(i, j) | [i,j)是一个有效范围。 | 创建一个序列,它是范围[i,j) | size()等于从i到j的距离。每个元素都是范围中对应元素的副本[i,j). |
范围构造函数 | X a(i, j); | [i,j)是一个有效范围。 | 创建一个序列,它是范围[i,j) | a.size()等于从i到j。中的每个元素a都是范围中对应元素的副本[i,j). |
首元素 | a.front() | !a.empty() | 等价于*(a.first()) | |
插入 | a.insert(p, t) | p是a中的有效迭代器a. a.size() < a.max_size() | 的副本t被插入到p. [2] [3] | a.size()之前。被递增1。*(a.insert(p,t))都是t。序列中已存在的元素的相对顺序保持不变。 |
填充插入 | a.insert(p, n, t) | p是a中的有效迭代器a. n >= 0 && a.size() + n <= a.max_size(). | n的t被插入到p. [2] [3] [4] | a.size()之前。被递增n。序列中已存在的元素的相对顺序保持不变。 |
范围插入 | a.insert(p, i, j) | [i,j)是一个有效范围。a.size()加上从i到j的距离不超过a.max_size(). | 将范围[i,j)的副本插入到p. [1] [2] [3] | a.size()之前。被递增从i到j。序列中已存在的元素的相对顺序保持不变。 |
擦除 | a.erase(p) | p是a中可解引用的迭代器a. | 销毁p指向的元素并将其从a. [3] | a.size()中移除。被递减1。序列中其他元素的相对顺序保持不变。返回值是指向被擦除元素后一个元素的迭代器。 |
范围擦除 | a.erase(p,q) | [p,q)是a中的有效范围a. | 销毁范围[p,q)中的元素并将其从a. [3] | a.size()中移除。被递减从i到j的距离。序列中其他元素的相对顺序保持不变。返回值是指向被擦除元素后一个元素的迭代器。 |
清空 | a.clear() | 等价于a.erase(a.begin(), a.end()) | ||
调整大小 | a.resize(n, t) | n <= a.max_size() | 修改容器,使其正好包含n个元素,根据需要在末尾插入元素或从末尾擦除元素。如果插入了任何元素,则它们是t的副本。如果n > a.size(),则此表达式等价于a.insert(a.end(), n - size(), t)的副本。如果n < a.size(),则它等价于a.erase(a.begin() + n, a.end()). | a.size() == n |
调整大小 | a.resize(n) | n <= a.max_size() | 等价于a.resize(n, T()). | a.size() == n |
首元素是摊销常数时间。
填充插入、范围插入和范围擦除是线性的。
单个元素插入和擦除的复杂度取决于序列。
[1] 目前(1998年初),并非所有编译器都支持“成员模板”。如果您的编译器支持成员模板,则i和j可以是符合输入迭代器要求的任何类型。但是,如果您的编译器尚不支持成员模板,则i和j必须是类型为const T*或类型为X::const_iterator.
[2] 请注意,p等于a.begin()表示在a的开头(即在a中已存在的任何元素之前)插入某些内容,并且p等于a.end()表示将某些内容追加到a.
[3] 警告:无法保证在a上的有效迭代器在插入或擦除后仍然有效。在某些情况下,迭代器确实保持有效,而在其他情况下则无效。每个序列类的细节都不同。
[4] a.insert(p, n, t)保证不会比调用a.insert(p, t) n次慢。在某些情况下,它会快得多。
[5] Vector 通常优于 deque 和 list。 Deque 在序列开头和末尾频繁插入的情况下很有用,而 list 和 slist 在序列中间频繁插入的情况下很有用。在几乎所有其他情况下,vector 效率更高。