游戏开发者联盟

[c++]一边遍历一边删除

How to remove element while iterating?

使用标准模板库的时候,想过这个问题吗?可能有人说做不到,实际上时可以的。

      //q_是个普通的队列,我们检测到符合条件的元素,就删除它。
      for (auto one = q_.begin(); one != q_.end();) {
        if (!exists(one->first)) {
          one = q_.erase(one); //删除函数的返回值是关键
        } else {
          one++;  //不删除的时候,要移动iterator
        }
      }

其实这里的关键就是erase方法的返回值,它返回的时下一个位置的iterator,如果到了末尾会返回end,注意,这里不需要++,因为已经时下一个了。

这样 ,我们一遍循环就完成了检测、删除,很高效。

那么插入呢?

根据文档上说,insert是不影响iterator的,所以,插入(insert或者[]运算)不影响遍历。亲测有效,代码就不粘贴了。

勤能生巧

这些都是很细节的东西,只有多编码,遇到更多的使用场景,才会遇到,然后解决,记住。记不住,就记个tips吧。我就是还没记住,所以才贴在这里,方便下次搜索。