【问题标题】:Does std::vector::erase make pointers invalid?std::vector::erase 是否使指针无效?
【发布时间】:2012-10-29 00:14:23
【问题描述】:
假设我有一个std::vector<Node*> nodes; 和一个std::vector<Unit*> units;。每个节点都指向一个单元,每个单元又指向节点,因此它们是相连的。但是当我使用 erase 从任一数组的中间删除一个元素时会发生什么?如果它调整数组的大小,这是否意味着它会删除所有元素,将它们存储在某个缓冲区中并重新构建调整大小的数组?所以如果我在节点上使用擦除,单元中的指针会变得无效?
【问题讨论】:
标签:
c++
pointers
stdvector
erase
【解决方案1】:
从向量中间删除或插入元素会适当地向下或向上移动所有较高的元素。但是由于您只是在移动指针,因此这几乎是微不足道的操作。其他指针(您没有擦除的指针)没有任何反应,任何 pointees 也没有任何反应。
【解决方案2】:
从指针向量中删除元素不会调用指针指向的对象的删除操作。您的节点单元指针将保持有效。
【解决方案3】:
对向量使用擦除会使擦除元素之后的所有元素的指针无效。
当您在向量中间使用擦除/插入时,其他元素将在内存中向下或向上移动,现在使用这些指针将产生未定义的行为。
如果您想保持这些指针有效,您的选择是:
擦除后,循环遍历刚刚使用擦除的向量并将元素指针重新分配给另一个向量。
使用列表。 list.erase() 不会使指针/迭代器无效,除了您正在擦除的元素,因此请确保删除您在其他向量中擦除的项目的指针。
列表的缺点是它们没有随机访问,因此您需要遍历,没有 list[] 适合您。
希望这会有所帮助。