std :: vector :: erase会使指针无效吗?

时间:2012-10-29 00:14:24

标签: c++ pointers stdvector erase

假设我有一个std::vector<Node*> nodes;和一个std::vector<Unit*> units;。每个节点指向一个单元,每个单元指向该节点,因此它们是连接的。但是当我使用 erase 从一个数组的中间删除一个元素时会发生什么?如果它调整数组的大小,这是否意味着它会删除所有元素,将它们存储在某个缓冲区中并构建调整大小的数组?因此,如果我在节点上使用擦除,则单位指针将变为无效?

3 个答案:

答案 0 :(得分:2)

从矢量中间移除或插入元素会使所有较高元素向下或向上移动。但由于你只是在移动指针,这是一个几乎无足轻重的操作。其他指针(你没有删除的指针)没有任何反应,任何指针都没有任何反应。

答案 1 :(得分:2)

从指针向量中删除元素不会在指针指向的对象上调用delete。您的节点&lt; - &gt;单位指针将保持有效。

答案 2 :(得分:0)

对向量使用擦除会使擦除元素后面的所有元素的指针无效。

当您在向量的中间使用erase / insert时,其他元素将在内存中向下或向上移动,并且使用这些指针现在将产生未定义的行为。

如果您想保持这些指针有效,您的选择是:

  1. 擦除后,循环浏览刚刚使用的向量擦除并将元素指针重新分配给另一个向量。

  2. 使用列表。 list.erase()不会使指针/迭代器失效,除了要擦除的元素,因此请确保删除在其他向量中擦除的项目的指针。

  3. 列表的缺点是它们没有随机访问权限,因此您需要迭代,不需要列表[]。

    希望这有帮助。