迭代正在改变的std :: list的有效方法?

Mar*_*som 8 c++ iterator list

我正在尝试迭代std::list但是有一个问题 - 在迭代期间执行的操作可能最终添加或从列表中删除元素.在这种情况下,添加不是问题,但删除可能最终使列表中的任何迭代器无效,包括序列中的当前或下一项.

决定修改列表的点远离迭代循环 - 调试器在两者之​​间的调用堆栈中显示40个函数调用.因此,无法根据删除修改迭代器.

我唯一能想到的是在开始时复制列表并迭代它,测试每个元素以确保它仍然在主列表中.这是一个O(n ^ 2)命题,如果可能的话,我想避免.

小智 2

您有三个选择:

  1. 就像你说的,制作列表的本地副本
  2. 当迭代器失效时重新开始(并且可能跳过n迭代?[with continue])

  3. 编辑:就像 Pubby 所说,将删除的元素标记为过期,并且当您添加元素时使用跳过n迭代的东西:)

迭代器不允许通过索引访问,因此这使得为您的问题想出一个优雅的解决方案变得有点困难。