13

这个问题std::vector<T>::clear的处理过程中,发现 C++ 标准似乎没有时间复杂度要求。

23.2.3 下的表 100 说:

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

而且……就是这样。在 23.3.6 下没有专门针对它的条目,也没有明确表明以下适用于clear

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

所以……这真的是真的吗?还是我只是错过了它?

4

1 回答 1

16

这似乎是DR 704(以及相关的DR 1301)的意外结果,它删除了措辞clear()相当于erase(begin(), end())因为erase()需要 MoveAssignable,在擦除每个元素时不需要它。删除定义erase()也删除了复杂性要求。这可能可以在编辑上处理;我已经向委员会提出了这个问题。

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

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

于 2012-12-30T22:36:25.803 回答