vector :: clear的复杂性是未指定的吗?

时间:2013-02-20 01:26:11

标签: c++ vector language-lawyer

根据Is `std::vector<primitive>::clear()` a constant time operation?的讨论,有人指出C ++标准似乎没有指定vector::clear的运行时间。

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

它真的没有说明,还是我错过了什么?

1 个答案:

答案 0 :(得分:7)

  

它真的没有说明,还是我错过了什么?

即可。目前,它确实没有具体说明。

There is an open library issue for this,其文本包含指向StackOverflow上相关问答的链接。 Jonathan Wakely对该问题的回答澄清了已经发生的事情。

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

  

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

允许进行可能的优化,但不强制要求。

即使链接的提案被接受,我们也不会认为clear()对于非类元素的序列容器具有O(1)复杂性,即使这似乎是自然而且常见的优化策略(以及dasblinkenlight this question on SO 的回答确认)。

允许实施采用这种策略(按照17.5.1.4/7),但是他们不会要求这样做,因为标准中没有任何地方存在这样的约束(也不是它建议被指定。