`std :: vector <T> :: clear`*的时间复杂度是否真的没有指定?

Lig*_*ica 13 c++ std language-lawyer

这个问题的过程中,发现std::vector<T>::clearC++标准似乎没有时间复杂性要求.

23.2.3下的表100说:

销毁所有元素a.使引用元素的所有引用,指针和迭代器a无效并且可能使过去的迭代器无效.发布:a.empty()退货true

而且......就是这样.在23.3.6下没有明确的条目,并且没有明确指出以下内容适用于clear:

[C++11: 23.3.6.1/1]:向量是一个支持随机访问迭代器的序列容器.此外,它支持(摊销)最后的恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.[..]

那么......这是真的吗?或者我只是错过了它?

Jon*_*ely 16

这似乎是DR 704(以及相关的DR 1301)的意外后果,它删除了clear()相当于erase(begin(), end())因为erase()需要MoveAssignable 的措辞,因为它在擦除每个元素时不需要.根据术语删除定义erase()也消除了复杂性要求.这可能是编辑性的; 我和委员会一起提出了这个问题.

NB std::deque::clear()std::forward_list::clear()也受到影响.std::list::clear()确实有复杂性保证.

编辑:现在是http://cplusplus.github.com/LWG/lwg-active.html#2231

  • 需要MoveAssignable用于`erase()`,`vector`和`deque`的序列容器已经提供了满足该需求的`pop_back()`和`resize()`.我不认为有一个当前的问题可以通过添加`truncate()`来解决,问题是`clear()`被不恰当地定义为`erase()`而不是没有办法清除非-MoveAssignable元素来自序列的末尾.问题是标准中措辞选择不当,而不是缺少功能. (2认同)