Nei*_*irk 42 c++ vector language-lawyer
本网站暗示清除向量可能会改变容量:
http://en.cppreference.com/w/cpp/container/vector/clear
许多实现在调用clear()之后不会释放已分配的内存,从而有效地保持向量的容量()不变.
但根据@JamesKanze的说法,这是错误的,标准要求明确不会改变容量.
标准说什么?
Jam*_*nze 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
Run Code Online (Sandbox Code Playgroud)
(原因在C措辞的变化++ 11:委员会不希望要求MoveAssignable
的clear
,这本来如果它在定义的情况erase
.)