0

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

4

3 回答 3

2

从向量的中间删除或插入元素会适当地向下或向上移动所有较高的元素。但是由于您只是在移动指针,因此这几乎是微不足道的操作。其他指针(您没有擦除的指针)没有任何反应,任何指针都没有任何反应

于 2012-10-29T00:27:35.853 回答
2

从指针向量中删除元素不会调用指针指向的对象的删除。您的 Node<->Unit 指针将保持有效。

于 2012-10-29T00:33:10.347 回答
0

在向量上使用擦除会使擦除元素之后的所有元素的指针无效。

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

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

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

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

列表的缺点是它们没有随机访问权限,因此您需要遍历,没有 list[] 适合您。

希望这可以帮助。

于 2016-10-08T07:17:42.243 回答