c ++-标准对如何在向量上调用clear改变容量有何看法?

该网站暗示清除媒介可能会改变容量:

[HTTP://恩.CPP reference.com/我/CPP/container/vector/clear]

许多实现不会在调用后释放分配的内存 清除(),有效地保留向量的容量() 不变。

但是根据@JamesKanze所说,这是错误的,明确的标准要求不会改变容量。

标准怎么说?

Neil Kirk asked 2020-08-12T07:15:01Z
1个解决方案
41 votes

根据您要查看的标准版本,clear被定义为等同于MoveAssignable,或(在C ++ 11中):
“销毁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中措辞更改的原因:委员会不想为clear要求MoveAssignable,这将如果是根据erase进行定义的话。)

James Kanze answered 2020-08-12T07:15:21Z
translate from https://stackoverflow.com:/questions/18467624/what-does-the-standard-say-about-how-calling-clear-on-a-vector-changes-the-capac