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

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:委员会不希望要求MoveAssignableclear,这本来如果它在定义的情况erase.)

  • @NeilKirk:如果容量发生变化,那么它将破坏`reserve`提供的保证:"保证在调用`reserve()`之后插入期间不会发生重新分配,直到插入时为止会使向量的大小大于`capacity()`"的值 (7认同)
  • @MikeSeymour:通过说"`当然clear()不是插入;但clear()之后的插入仍然受到保证,所以clear()不能减少容量.",这是否意味着甚至复制/移动分配不能减少容量(我会非常惊讶)? (3认同)
  • @MikeSeymour:我认为保证中提到的`capacity()`应该是插入操作时`capacity()`的值,而不是`reserve()之后的`capacity()`的值`打电话.因此,如果允许`clear()`缩小容量,则保证不会中断.是否允许"clear()"缩小容量是另一个问题,我只是说你在这里使用的理由是不合适的. (3认同)
  • @JamesKanze:如果我们将'除了指定的规则之外没有额外的可观察行为规则(我完全同意)应用于向量的复制/移动赋值,我们是否可以得出结论,复制/移动赋值不允许减少向量的容量要么?这似乎很不合理.这里出了什么问题? (3认同)
  • @jrok deallocation也不应该重新分配,因此将容量更改为0不会损害该要求. (2认同)
  • @juanchopanza:当然`clear()`不是插入; 但是*`clear()`之后的插入*仍然受到保证,所以`clear()`不能减少容量. (2认同)
  • @NicolBolas这正是我的观点.该标准定义了函数的可观察行为,并且该函数不能具有任何其他可观察行为.在很多情况下我们认为这是理所当然的:`open`不会重新格式化你的磁盘,虽然我怀疑你会在`open`的描述(Posix或其他)中找到这样的声明. (2认同)
  • @MikeSeymour:标准说重新分配不会发生"直到插入使得向量的大小大于capacity()的值."`.是的,'插入'很可能是在`clear()`之后,但是那时,`capacity()`可能已经被改变了,所以重新分配不会破坏保证.(C++ 11与C++ 03的不同之处在于,对`insertion`的非重新分配的保证是针对`capacity()`,而不是最近调用`reserve()`时传递的参数.) (2认同)
  • @JamesKanze:谢谢你的回复.我也很困惑.我在2天前提出了一个关于矢量复制/移动任务的单独问题:http://stackoverflow.com/questions/22253355/what-happens-to-the-underlying-storage-upon-vectors-copy-move-assignment否到目前为止令人信服的答案 如果你能在那里提供你的想法,那将是很棒的.再次感谢. (2认同)