删除向量(通过擦除)内存的尾部有效吗?

时间:2017-05-16 11:14:02

标签: c++ stl

执行v.erase(some_iterator);

实现是否足够聪明,不能进行任何重新分配/字节复制,因为我们只能更新大小? (与严格删除内部元素时不同。)

2 个答案:

答案 0 :(得分:12)

std::vector中删除不会使迭代器失效,也不会在第一个擦除元素之前对元素进行引用。

因此,如果您只删除最后一个元素,则可以保证所有其他元素都保持原样,不会移动或复制它们。

但是,请注意,从std::vector删除通常只会更改其大小,而不是其容量,因此旧对象所在的内存仍归vector所有。这是出于性能原因而没有什么可担心的(除非你的RAM耗尽)。

此外,删除的对象当然是正确破坏的,因此如果它们不是简单的可破坏的,除了调整vector的大小之外,还必须运行它们的析构函数。

答案 1 :(得分:0)

通过擦除不会改变矢量容量。只是指向结束的指针被改变了。使用shrink_to_fit(C​​ ++ 11)来真正释放内存

int main (int argc, char* argv []) {
  size_t tmp [5] = {0, 1, 2, 3, 4};
  std::vector<size_t> vec (tmp, tmp+5);
  std::cout << "vec.capacity () == " << vec.capacity () << std::endl;
  std::vector<size_t>::iterator i (&vec [3]);
  vec.erase (i, vec.end ());
  std::cout << "vec.capacity () after erase == " << vec.capacity () << std::endl;
  vec.shrink_to_fit ();
  std::cout << "vec.capacity () after shrink_to_fit == " << vec.capacity () << std::endl;
}

将输出:

vec.capacity () == 5
vec.capacity () after erase == 5
vec.capacity () after shrink_to_fit == 3