12

根据来自 `std::vector<primitive>::clear()`的讨论是否是一个恒定时间操作?,注意到 C++ 标准似乎没有指定vector::clear.

它为有序(表 102)和无序关联容器(表 103)(均为线性)指定list::clear(线性;§23.3.5.4.5)的运行时间。.clear但是,vector::clear似乎缺少(尽管其他vector成员,喜欢.data并且.swap似乎具有指定的复杂性)。

真的是未指定,还是我错过了什么?

4

1 回答 1

7

真的是未指定,还是我错过了什么?

的。目前,它确实未指定。

对此有一个开放的库问题,其文本包含指向 StackOverflow 上相关问答的链接。Jonathan Wakely对这个问题的回答澄清了正在发生的事情。

根据链接的提议,所有序列容器的复杂度要求clear()应该是线性的。但是,必须记住,复杂性要求只是上限。根据 C++11 标准的第 17.5.1.4/7 段:

库子句中指定的复杂性要求是上限,提供更好的复杂性保证的实现满足要求。

允许可能的优化,但不强制它们。

即使链接提案将被接受,我们也不允许假设clear()非类元素的序列容器具有 O(1) 复杂性,即使这似乎是一种自然且常见的优化策略(以及dasblinkenlight的答案对SO的这个问题证实了这一点)。

实现将被允许采用此策略(根据 17.5.1.4/7),但他们不会被要求这样做,因为在标准中没有任何地方(也不建议)指定这样的约束。

于 2013-02-20T02:12:03.827 回答