C++ 概念: SequenceContainer

来自cppreference.com
< cpp‎ | concept
 
 
 

顺序容器 (SequenceContainer) 是在线性排列中存储相同类型对象的容器 (Container) 。

[编辑] 要求

类型 X 满足顺序容器 (SequenceContainer) ,若

  • 类型 X 满足容器 (Container) ,且

给定

  • TX 的元素类型
  • AX 的分配器类型:若存在则为 X::allocator_type ,否则为 std::allocator<T>
  • aX 类型的左值表达式
  • p ,到 a 的合法常迭代器
  • q ,到 a 的合法可解引用常迭代器
  • q1q2 ,二个到 a 的合法常迭代器,满足 [q1, q2) 是合法范围
  • ij输入迭代器 (InputIterator) ,满足 [i, j) 是合法范围且迭代器指代能隐式转换成 value_type 对象
  • ilstd::initializer_list<value_type> 类型对象
  • nX::size_type 类型的值
  • tX::value_type 类型的左值或 const 右值
  • rvX::value_type 类型的非 const 右值
  • Args :模板参数包
  • args :拥有模式 Arg&& 的函数参数包

下列表达式必须合法且拥有其对所有除了 std::array 的顺序容器的效应:

表达式 返回类型 效果 前提条件 后置条件
X(n, t)

X a(n, t)

构造保有 nt 副本的容器 T 可复制插入 (CopyInsertable) 到 X std::distance(begin(),end()) == n
X(i, j)

X a(i, j)

构造逐元素与范围 [i,j) 相等的顺序容器 T 可原位构造 (EmplaceConstructible) 自 *iX

(仅对 std::vector)若迭代器不是向前迭代器 (ForwardIterator) ,则 T 必须可复制插入 (CopyInsertable)

std::distance(begin(),end()) == std::distance(i,j)
X(il) X(il.begin(), il.end())
a = il X& il 所表示的范围赋值到 a[1] T 可复制插入 (CopyInsertable) 且可复制赋值 (CopyAssignable) a 的既存元素被销毁或被赋值
a.emplace(p,args) iterator p 前插入以 std::forward<Args>(args) 构造的 T类型对象 T 可复制插入 (CopyInsertable)

(对 std::vector 与 std::deque) T 可移动赋值 (MoveAssignable) 且可移动插入 (MoveInsertable)

返回指向从 args 构造到 a 的元素的迭代器
a.insert(p,t) iterator p 前插入 t 的副本 T 可复制插入 (CopyInsertable)

(对 std::vector 与 std::deque) T 可复制赋值 (CopyAssignable) 或可移动赋值 (MoveAssignable)

返回指向插入到 at 副本的迭代器
a.insert(p,rv) iterator p 前插入 rv 的副本,可能用移动语义 T 可移动插入 (MoveInsertable)

(对 std::vector 与 std::deque) T 可移动赋值 (MoveAssignable)

返回指向插入到 arv 副本的迭代器
a.insert(p,n,t) iterator 插入 nt 的副本到 p 之前 T 可复制插入 (CopyInsertable) 且可复制赋值 (CopyAssignable) 返回指向插入到 a 的首元素的副本的迭代器,或对于 n==0p
a.insert(p,i,j) iterator 插入 [i, j) 中元素副本到 p T 可原位构造 (EmplaceConstructible) 且 ij 不在 a

(仅对 std::vector)若迭代器不是向前迭代器 (ForwardIterator) ,则 T 必须可复制插入 (MoveInsertable) 且可复制赋值 (MoveAssignable)

[i,j) 中每个迭代器被解引用一次。返回指向插入到 a 的首元素的副本的迭代器,或对于 i==jp
a.insert(p, il) iterator a.insert(p,il.begin(),il.end()) 返回指向插入到 a 的首元素的副本的迭代器,或若 il 为空则为 p
a.erase(q) iterator 擦除 q 所指向的元素 (std::deque, std::vector) T 可移动赋值 (MoveAssignable) 返回指向擦除前立即后随 q 的元素的迭代器,或若此种元素不存在则返回 a.end()
a.erase(q1,q2) iterator 擦除 [p,q) 中的元素 (std::deque, std::vector) T 可移动赋值 (MoveAssignable) 返回指向在任何擦除前 q2 曾指向的元素的迭代器,或若不存在此种元素则返回 a.end()
a.clear() void 销毁 a 中所有元素

所有引用、指针及迭代器被非法化,包含尾迭代器。 a.empty() == true

a.assign(i,j) void [i, j) 的副本替换 a 中的元素 T 可原位构造 (EmplaceConstructible) 且 ij 不在 a

(std::vector),若非向前迭代器 (ForwardIterator) 。 T 可移动构造 (MoveInsertable)

[i,j) 中每个迭代器被解引用一次
a.assign(il) void a.assign(il.begin(),il.end())
a.assign(n,t) void tn 个副本替换 a 中的元素 T 可复制插入 (CopyInsertable) 并可复制赋值 (CopyAssignable)
注意
  1. std::array 支持从花括号初始化器列表,但不支持从 std::initializer_list 赋值

下列表达式必须合法,且拥有其对指名的顺序容器的指定效应:

表达式 返回类型 效果 前提条件 容器
a.front() reference

对于 const a 为 const_reference

等价于 *a.begin() (全部)
a.back() reference

对于 const a 为 const_reference

等价于 { auto tmp = a.end(); --tmp; return *tmp; } std::basic_string std::array std::deque std::list std::vector
a.emplace_front(args) void 前附以 std::forward<Args>(args)... 构造的 T Targs 可原位构造 (EmplaceConstructible) 到 X std::deque std::forward_list std::list
a.emplace_back(args) void 后附以 std::forward<Args>(args)... 构造的 T Targs 可原位构造 (EmplaceConstructible) 到 X

(仅 std::vector) T 可移动构造 (MoveInsertable) 到 X

std::deque std::list std::vector
a.push_front(t) void 前附 t 的副本 T 可复制构造 (CopyInsertable) 到 X std::deque std::forward_list std::list
a.push_front(rv) void 前附 rv 的副本,可能用移动语义 T 可移动构造 (MoveInsertable) 到 X std::deque std::forward_list std::list
a.push_back(t) void 后附 t 的副本 T 可复制构造 (CopyInsertable) 到 X std::basic_string std::deque std::list std::vector
a.push_back(rv) void 后附 rv 的副本,可能用移动语义 T 可移动构造 (MoveInsertable) 到 X std::basic_string std::deque std::list std::vector
a.pop_front() void 销毁首元素。 a.empty() == false std::deque std::forward_list std::list
a.pop_back() void 销毁最末元素 a.empty() == false std::basic_string std::deque std::list std::vector
a[n] reference

对于 const a 为 const_reference

等价于 *(n + a.begin()) std::basic_string std::array std::deque std::vector
a.at(n) reference

对于 const a 为 const_reference

等价于 *(n + a.begin()) ,除了若 n>=size() 则抛出 out_of_range std::basic_string std::array std::deque std::vector

另外,对于每个顺序容器,接收二个输入迭代器的构造函数模板和成员函数 insert()append()assign()replace() 的模板重载不参与重载决议,若对应的模板实参不满足输入迭代器 (InputIterator) 。

[编辑] 标准库中的顺序容器 (SequenceContainer)

存储并操作字符序列
(类模板) [编辑]
(C++11 起)
静态的相接数组
(类模板) [编辑]
动态的相接数组
(类模板) [编辑]
双向队列
(类模板) [编辑]
(C++11 起)
单链表
(类模板) [编辑]
双链表
(类模板) [编辑]

[编辑] 权衡/使用注意

std::array 快速访问但元素数量固定
std::vector 快速访问但大多情况在插入/删除低效
std::list
std::forward_list
在序列中部高效地插入/删除
std::deque 在序列首尾高效地插入/删除