根据来自 `std::vector<primitive>::clear()`的讨论是否是一个恒定时间操作?,注意到 C++ 标准似乎没有指定vector::clear
.
它为有序(表 102)和无序关联容器(表 103)(均为线性)指定list::clear
(线性;§23.3.5.4.5)的运行时间。.clear
但是,vector::clear
似乎缺少(尽管其他vector
成员,喜欢.data
并且.swap
似乎具有指定的复杂性)。
真的是未指定,还是我错过了什么?
根据来自 `std::vector<primitive>::clear()`的讨论是否是一个恒定时间操作?,注意到 C++ 标准似乎没有指定vector::clear
.
它为有序(表 102)和无序关联容器(表 103)(均为线性)指定list::clear
(线性;§23.3.5.4.5)的运行时间。.clear
但是,vector::clear
似乎缺少(尽管其他vector
成员,喜欢.data
并且.swap
似乎具有指定的复杂性)。
真的是未指定,还是我错过了什么?
真的是未指定,还是我错过了什么?
是的。目前,它确实未指定。
对此有一个开放的库问题,其文本包含指向 StackOverflow 上相关问答的链接。Jonathan Wakely对这个问题的回答澄清了正在发生的事情。
根据链接的提议,所有序列容器的复杂度要求clear()
应该是线性的。但是,必须记住,复杂性要求只是上限。根据 C++11 标准的第 17.5.1.4/7 段:
库子句中指定的复杂性要求是上限,提供更好的复杂性保证的实现满足要求。
这允许可能的优化,但不强制它们。
即使链接提案将被接受,我们也不允许假设clear()
非类元素的序列容器具有 O(1) 复杂性,即使这似乎是一种自然且常见的优化策略(以及dasblinkenlight的答案对SO的这个问题证实了这一点)。
实现将被允许采用此策略(根据 17.5.1.4/7),但他们不会被要求这样做,因为在标准中没有任何地方(也不建议)指定这样的约束。