1 迭代器是什么?
迭代器是一种典型的设计模式,与集合配套使用,其目的是隐藏集合中的内部成员,并且提供对集合成员的访问能力。其结构如下图所示;
具体协作关系及实现方式,就不在此赘述了。
2 在迭代器上执行删除操作
下面以删除list中所有给定值的元素为例,介绍迭代器的一种常见写法及原理解释。
错误写法:
- std::list<int>::iterator it = listVar.begin();
- while(it != listVar.end())
- {
- // 相等,则删除当前位置并后移
- if (*it == iVar)
- {
- listVar.erase(it); // 删除当前位置
- it++; // 向后移动
- }
- // 不相等,则向后移动
- else
- {
- it++;
- }
- }
正确写法一:
- std::list<int>::iterator it = listVar.begin();
- std::list<int>::iterator = listVar.end();
- while(it != listVar.end())
- {
- // 相等,则删除当前位置并后移
- if (*it == iVar)
- {
- itNext = it;
- itNext++; // 先获取到当前位置的下一个位置
- listVar.erase(it); // 删除当前位置
- it = itNext; // 将下一个位置赋值给it
- }
- // 不相等,则向后移动
- else
- {
- it++;
- }
- }
在删除指定位置前,此时迭代器是有效的,先获取其下一个位置,然后删除当前位置,最后再将下一位置赋值给当前迭代器。这个方法是可行的,但是写法很冗余,其实这几步,一行就可以搞定
正确写法二:
- while(it != listVar.end())
- {
- // 相等,则删除当前位置并后移
- if (*it == iVar)
- {
- listVar.erase(it++); // 删除当前位置并后移
- }
- // 不相等,则向后移动
- else
- {
- it++;
- }
- }
相信大家在平时写代码时也都是这么用的,但为什么这样写可行,可能有些同学就说不清楚了。
首先,it++是一个函数调用,其调用的函数为迭代器的operator++()方法,该方法将迭代器自身向后移动一个位置,同时其返回当前位置。
然后,erase执行时,传递进来的迭代器是当前位置的拷贝的一个临时迭代器,而it此时已经指向下一个位置了。