【发布时间】:2013-06-06 16:56:58
【问题描述】:
我正在尝试遍历 std::list,但有一个问题 - 迭代期间执行的操作最终可能会在列表中添加或删除元素。在这种情况下,添加不是问题,但删除可能会导致列表中的任何迭代器失效,包括序列中的当前项或下一项。
决定修改列表的点与迭代循环相去甚远——调试器在两者之间的调用堆栈中显示了 40 个函数调用。因此,无法根据删除来修改迭代器。
我唯一能想到的就是在开始时复制列表并对其进行迭代,测试每个元素以确保它仍在主列表中。这是一个 O(n^2) 的命题,我想尽可能避免。
【问题讨论】:
-
你确定不能修改迭代器吗?那将是 IMO 最干净的解决方案。您还可以尝试将元素设置为“过期”值,然后进行迭代以稍后将其删除。
-
您可以改为使用
shared_ptrs 列表,然后用对应的weak_ptrs 填充列表并对其进行迭代,检查每个weak_ptr是否仍然有效。 -
您可以在指向被擦除元素的迭代器上使用后自增运算符擦除,例如
myList.erase(it++)。就像@Boris 在他的回答中所说,任何其他迭代器仍然有效。 -
@freitass,您是否错过了我所说的擦除调用发生 40 个函数调用远离循环本身的部分?这使您的解决方案有点不切实际。
-
对不起,我想我做到了。