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

时间:2012-12-30 20:35:14

标签: c++ std language-lawyer

this question的会议记录中,发现C ++标准似乎没有对std::vector<T>::clear提出时间复杂性要求。

23.2.3下的表100说:

  

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

而且......就是这样。在23.3.6下没有专门的条目,并且没有显式表明以下内容适用于clear

  

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

所以......这是真的吗?或者我只是错过了它?

1 个答案:

答案 0 :(得分:16)

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

N.B。 erase()std::deque::clear()也会受到影响。 std::forward_list::clear()确实有复杂性保证。

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