关于如何调用一个向量来改变容量,标准说的是什么?
本网站暗示,清除vector可能会改变容量:
http://en.cppreference.com/w/cpp/container/vector/clear
在调用clear()之后,许多实现不会释放分配的内存,实际上将vector的capacity()保持不变。
但根据詹姆斯·坎泽的说法,这是错误的,标准要求明确不会改变能力。
标准说什么?
取决于你正在查看的标准版本, clear
被定义为等同于erase(begin(), end())
或(在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中措辞改变的原因:委员会不希望要求MoveAssignable
clear
,如果以erase
定义,则是这种情况。)