关于如何在向量上调用清晰度改变容量,标准说了什么?

时间:2013-08-27 14:02:02

标签: c++ vector language-lawyer

本网站暗示清除向量可能会改变容量:

http://en.cppreference.com/w/cpp/container/vector/clear

  

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

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

标准说什么?

1 个答案:

答案 0 :(得分:41)

根据您所查看的标准版本, 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 clearerase 如果用{{1}}来定义,那就是这种情况。)