C ++在没有重新分配的情况下擦除矢量结尾的一部分

时间:2014-07-28 21:25:13

标签: c++ memory-management vector

查看C ++矢量文档,pop_back()是一个不会导致矢量数据重新分配的函数。但是,这仅适用于删除向量的一个成员。我试图找到一种从矢量末尾擦除多个成员的方法。最初我以为我会在一个小的for循环中调用pop_back()但是如果有一个更方便的函数可以为我做这个游戏我会徘徊吗?

编辑: Cplusplus vector erase() reference并不像juanchopanza所指出的那样清晰。这就是我最初使用erase()丢弃的原因。擦除后,效果很好。

2 个答案:

答案 0 :(得分:4)

使用vector::erase。它不会重新分配内存。

如果擦除的范围没有延伸到容器的末尾,它将重新定位终端元素。这意味着结尾元素将move d到它们在内存中的适当位置,这可能会导致数据复制。这与后备存储的重新分配不同。如果您的结尾元素是myVector.end(),则不需要进行重定位。

答案 1 :(得分:3)

您可以使用成员函数erase。因为根据C ++标准,例如,不会重新分配该向量。 C++17 n4659 standard draft 26.3.11.5 [vector.modifiers]"向量修饰符":

iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);
     

3效果:在删除点或之后使迭代器和引用无效

引号的粗体部分表示不会重新分配矢量。