根据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
似乎具有指定的复杂性。)
它真的没有说明,还是我错过了什么?
答案 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),但是他们不会要求这样做,因为标准中没有任何地方存在这样的约束(也不是它建议被指定。