C++ 具名要求:容器 (Container)

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

容器 (Container) 是用于存储其他对象并负责管理那些对象使用的内存的对象。

目录

[编辑] 要求

给定以下类型和值:

类型 定义
T 对象类型
C 包含 T 类型对象的容器类
定义
u, v Cconst C 类型的值
mv C 类型的值
cv const C 类型的值
lhsrhs C 类型的左值
ij C::iteratorconst C::iterator 类型的值

C 在以下类型,语句和表达式都良构并具有指定的语义时满足容器 (Container)

[编辑] 类型

类型 定义 要求
typename C::value_type T T 可复制构造 (CopyConstructible) (C++11 前)C 可擦除 (Erasable) (C++11 起)
typename C::reference T& 无显式要求
typename C::const_reference const T&
typename C::iterator 迭代器类型
typename C::const_iterator 常迭代器类型 C::const_iterator老式向前迭代器 (LegacyForwardIterator) ,并且它的值类型T
typename C::difference_type 有符号整数类型  C::difference_typeC::iteratorC::const_iterator差类型相同。
typename C::size_type 无符号整数类型 C::size_type 足以表示 C::difference_type 的所有非负值。

[编辑] 语句

语句 语义  复杂度 
C c;

C c = C();

后条件  c.empty()true 常数
C c(v);

C c = C(v);

前条件

如果 v 不是 C 类型右值,那么 T 可复制插入 (CopyInsertable) C 中。

(C++11 起)
线性[1]
后条件
  • 如果 v 是左值,那么 c == vtrue.
  • 如果 v 是右值,并且 cv 表示不同对象(C++11 起),那么 c 等于 v 在本次构造之前的值。
注解
  1. 如果 vC 类型右值,并且 C 不是 std::arraystd::inplace_vector 的特化,那么复杂度是常数。

[编辑] 表达式

表达式 类型 语义  复杂度 
C() C 后条件  C().empty()true 常数
C(v) C 前条件

如果 v 不是 C 类型右值,那么 T 可复制插入 (CopyInsertable) C 中。

(C++11 起)
常数[1]
后条件
  • 如果 v 是左值,那么 C(v) == vtrue
  • 如果 v 是右值,并且 C(v)v 表示不同对象(C++11 起),那么 C(v) 等于 v 在本次构造之前的值。
lhs = v C& 后条件
  • 如果 v 是左值,那么 lhs == vtrue
  • 如果 v 是右值,并且 lvv 表示不同对象(C++11 起),那么 lhs 等于 v 在本次赋值之前的值。
线性
v.~C() void 效果 销毁 v 的所有元素并解分配所有获取到的内存。 线性
mv.begin() C::iterator 效果 返回指向 mv 的首元素的迭代器。 常数
cv.begin() C::const_iterator 效果 返回指向 cv 的首元素的迭代器。 常数
mv.end() C::iterator 效果 返回 mv 的尾后迭代器。 常数
cv.end() C::const_iterator 效果 返回 cv 的尾后迭代器。 常数
v.cbegin()
(C++11 起)
C::const_iterator 效果 返回 const_cast<const C&>(v).begin() 常数
v.cend()
(C++11 起)
C::const_iterator 效果 返回 const_cast<const C&>(v).end() 常数
i <=> j
(C++20 起)
std::strong_ordering     约束 此表达式只要求在 C::iterator 满足随机访问迭代器时良构。 常数
u == v bool 效果 返回
u.size() == v.size() &&
    std::equal(u.begin(),
         u.end(), v.begin())
(C++14 前)
std::equal(u.begin(), u.end(),
           v.begin(), v.end())
(C++14 起)
线性[2]
u != v 效果 等价于 !(u == v)
lhs.swap(rhs)

swap(lhs, rhs)

void 效果 交换 lhsrhs 的内容。 常数[3]
v.size() C::size_type 效果 返回 v 的元素数量。[4] 常数
v.max_size() C::size_type 效果 返回可能存在的最大 C 类型容器的元素数量。 常数
v.empty() bool 效果 返回 v.begin() == v.end() 常数
可选容器要求
(仅对某些类型的容器提供)
u <=> v
(C++20 起)
synth-three-way-result
    <C::value_type>
前条件 要么 T 实现 three_way_comparable,要么 operator< 是一种对 Tconst T 类型的值定义的全序关系。 线性
效果 返回 std::lexicographical_compare_three_way
    (u.begin(), u.end(),
     v.begin(), v.end(),
     synth-three-way )
[5]
注解
  1. 如果 vC 类型右值,并且 Cstd::arraystd::inplace_vector 的特化,那么复杂度是线性。
  2. 如果 u.size() != v.size()true,那么复杂度是常数。