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吧。我就是还没记住,所以才贴在这里,方便下次搜索。