众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。本文完整源码:https://code.csdn.net/snippets/173595
首先,要明白使用正向迭代器(iterator)进行反向遍历是错误的用法,要不干嘛要有反向迭代器呢(reverse_iterator)。其次,根据容器的特性,遍历删除操作的用法可以分为两组,第一组是 list 和 vector,第二组是 map 和 set。
接下来,看看具体怎么个用法。
第一种情形:正向遍历删除元素
对 list 和 vector 来说,它们的 erase 函数会返回下一个迭代器,因此在遍历时,只需要 it = c.erase(it); 即可。
对 map 和 set 来说,它们的 erase 函数返回的 void,而在进行 erase 之后,当前迭代器会失效,无法再用于获取下一个迭代器。因此需要 erase 之前就获取指向下一个元素的迭代器。如:
tmpIt = it;
++it;
c.erase(tmpIt);
利用后缀++操作符的特性(先创建副本,然后再递增迭代器,然后返回副本)上面的三行代码可以简化为一行:
c.erase(it++);
下面来看实例:
list 正向遍历删除元素示例(vector 用法相同):
// erase with iterator list<int>::iterator it; for (it = l.begin(); it != l.end();) { if (0 == (*it) % 2) { it = l.erase(it); } else { ++it; } }
map 正向遍历删除元素示例(set 用法相同):
// erase with iterator map<int, int>::iterator mit; for (mit = m.begin(); mit != m.end();) { if (0 == mit->first % 2) { m.erase(mit++); } else { ++mit; } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索迭代器
, iterator
, 迭代
, 元素
, erase
, 遍历元素
, 正向
, 反向
, stl迭代器失效
, 遍历删除
, 遍历删除出错
, 迭代器遍历
, map用法
反向迭代
iterator 遍历 删除、iterator删除元素、reverse iterator、c reverse iterator、listreverseiterator,以便于您获取更多的相关知识。