它真的能保证以下减少容量的技巧在任何地方都能“起作用”吗?
int main() {
std::string s = "lololololol";
s = ""; // capacity still non-zero
string(s).swap(s); // ?
}
它似乎对我来说“不起作用”(因为容量保持非零),而且我在标准中找不到任何比“内容”必须在两者之间交换[此处,相同]对象。
同样,对于序列容器:
int main() {
vector<int> v { 1,2,3,4,5 };
v.clear(); // capacity still non-zero
vector<int>(v).swap(v); // ?
}
据我所知,这个“技巧”已经被半广泛使用。也许这种广泛采用是被误导的?
(Of course, in C++11 we have shrink_to_fit
[albeit non-binding] instead, making this kind of moot.)
我一直被教导没有保证降低容量的标准方法。所有方法都已经(并且仍然是)实现定义的。
§ 23.2.1\8 说:
表达方式a.swap(b)
, 对于容器a
and b
一个标准的
集装箱类型除外array
,应交换以下值a
and b
无需对个体调用任何移动、复制或交换操作
容器元素...
这保证了向量的内部指针必须被交换。
但是,我找不到任何可以保证新创建的向量容量的东西。
§ 21.4.2\1 说其中之一basic_string
默认构造函数的后置条件是capacity()
返回一个未指定的值。
§ 21.4.2\3 说 basic_string 复制构造函数的后置条件之一是capacity()
返回一个值至少与size()
.
§ 21.4.6.8\2 说string::swap
以恒定时间运行,这(有效地)要求交换内部指针。
据我所知,符合要求的实现可能有string::max_size() { return 4;}
,因此将所有内部结构从一个缓冲区交换到另一个缓冲区将是常数时间。 (但向量不能做到这一点)
显然,对这一切持保留态度。我引用的是 2011 年 2 月 28 日的 C++ 草案,但我找不到向量复制构造函数的规范。另外,找不到证据for不等于找到证据against.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)