显然;-)标准容器提供某种形式的保证.
什么类型的保证以及不同类型的容器之间究竟有什么区别?
Container Types:
================
Container:
Forward Container
Reverse Container
Random Access Container
Sequence
Front Insert Sequence
Back Insert Sequence
Associative Container
Simple Associative Container
Pair Associative Container
Sorted Associative Container
Multiple Associative Container
Container Types mapped to Standard Containers
=============================================
std::vector: Sequence Back Sequence Forward/Reverse/Random Container
std::deque: Sequence Front/Back Sequence Forward/Reverse/Random Container
std::list: Sequence Front/Back Sequence Forward/Reverse Container
std::set: Sorted/Simple/Unique Associative Container Forward Container
std::map: Sorted/Pair/Unique Associative Container Forward Container
std::multiset: Sorted/Simple/Multiple Associative Container …
Run Code Online (Sandbox Code Playgroud) 在回答的过程中的另一个问题,我偶然发现稍有不同的措辞为std::vector::erase()
和std::deque::erase()
.
这就是C++ 14所说的std::deque::erase
([deque.modifiers]/4-6
强调我的):
效果: ......
复杂性:对析构函数的调用次数与擦除的元素数相同,但对赋值运算符的调用次数不超过删除元素之前的元素数量和次要元素数量之后的次数.擦除元素.
抛出:除非复制构造函数,移动构造函数,赋值运算符或移动赋值运算符抛出异常,否则无效
T
.
以下是关于std::vector::erase
([vector.modifiers]/3-5
)的内容:
效果: ......
复杂性:的析构函数
T
被调用的次数等于擦除的元件的数量的数量,但该移动赋值运算符的T
被称为的次数等于在向量元素的擦除元件后的数目的数目.抛出:除非复制构造函数,移动构造函数,赋值运算符或移动赋值运算符抛出异常,否则无效
T
.
正如您所看到的,两者的异常规范是相同的,但是为了std::vector
明确提到它,调用了移动赋值运算符.
还有的要求T
是MoveAssignable
对erase()
两者的工作std::vector
和std::deque
(表100),但这并不意味着移动赋值运算符的存在:一个可以定义一个拷贝赋值运算符,而不是定义移动赋值操作符,而这个班会是MoveAssignable
.
为了以防万一,我检查了GCC和Clang,std::vector::erase()
如果没有移动赋值运算符,确实调用了复制赋值运算符,并且std::deque::erase()
执行相同的操作(DEMO).
所以问题是:我错过了什么,或者这是标准中的(编辑)问题?
更新: 我已经提交了LWG问题#2477.