该网站暗示清除向量可能会改变容量:
http://en.cppreference.com/w/cpp/container/vector/clear
许多实现在调用 clear() 后不会释放分配的内存,实际上保持向量的容量() 不变。
但根据@JamesKanze 的说法,这是错误的,明确的标准要求不会改变容量。
标准是怎么说的?
该网站暗示清除向量可能会改变容量:
http://en.cppreference.com/w/cpp/container/vector/clear
许多实现在调用 clear() 后不会释放分配的内存,实际上保持向量的容量() 不变。
但根据@JamesKanze 的说法,这是错误的,明确的标准要求不会改变容量。
标准是怎么说的?
根据您正在查看的标准版本,
clear
定义为等效于erase(begin(), end())
, 或(在 C++11 中):
“销毁 a 中的所有元素。使所有引用 a 和可能会使过去的迭代器无效。”
在这两种情况下都不允许修改容量;标准保证以下代码是安全的:
std::vector<int> v;
for (int i = 0; i != 5; ++ i) {
v.push_back(i);
}
assert(v.capacity() >= 5);
v.clear();
assert(v.capacity() >= 5);
v.push_back(10);
v.push_back(11);
std::vector<int>::iterator i = v.begin() + 1;
v.push_back(12);
v.push_back(13);
*i = 42; // i must still be valid, because none of
// the push_back would have required an
// increase of capacity
(C++11 中措辞变化的原因:委员会不想要求MoveAssignable
for clear
,如果它是根据 定义的,情况就会如此erase
。)