C++

C++删除和添加等操作可能会使当前迭代器失效

内容概要:c++ 迭代器失效

TheHuPost newsletter上线了, 欢迎大家订阅! 
对C++, Java,JavaScript,Python等编程语言有兴趣的,也可以看看编程语言。
也欢迎大家来论坛与我讨论

c++ 迭代器失效

c++ 中erase ,pop_front,pop_back 函数会使指向被删除元素的所有迭代器失效

对于vector 容器来说,指向删除节点后面的元素的迭代器也会失效

对于deque容器,如果删除时不包含第一个或最后一个元素,那么该deque容器相关的所有迭代器都会失效

eg1.  实现函数,删除vector 容器中的偶数元素

由于 c++ 迭代器失效 的原因,单纯的遍历一次整个容器不能达到目标, 每次发生erase操作后,都需要从头开始使用新的迭代器进行遍历,故考虑使用递归实现:

void deleteVectorOdd(vector<int> & ivec)
{
   for(vector<int>::iterator i = ivec.begin() ; i!= ivec.end(); ++i)
   {
       if( (*i) %2 ==0)
         {
             ivec.erase(i);
             deleteVectorOdd(ivec);
             break;
         }
    }

}


eg2.  实现函数,删除list 容器中的奇数元素

与上面类似,c++ 迭代器失效 ,也使用递归实现

void deleteListeven(list<int> & ilist)
{
    for(list<int>::iterator i = ilist.begin() ; i!= ilist.end() ; ++i)
    {
        if(  (*i) %2 !=0)
          {
              ilist.erase(i);
              deleteListeven(ilist);
              break;
          }
    }
}

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top