zoukankan      html  css  js  c++  java
  • C++中list的erase()函数问题

    典型错误

    for(list::iterator it=li.begin();it!=li.end();it++){
        li.erase(it);
    }
    

    问题:该程序不能跳出循环
    原因:li.erase(it);每次做erase时都有可能使迭代器失效,it++就发生错误了。可以参见effective stl一书。所有容器做erase操作时都有可能使迭代器失效。

    因为,当list执行erase函数后,会删除对应it的元素,这时迭代器it自动更新为下一个元素的地址(下一个指删除元素的下一个)。这时再执行it++,就会把

    迭代器it指向删除元素的下下个,导致最终失效,因为跳过一个元素。

    正确写法有:

    while{ it!= li.end(); ){
    		if (*it % 2)
    		{
    			li.erase(it++); //在删除it还在时,对其++
    		}
    		else
                    {
    			it++;
                    }
    }
    

     或者:

    while{ it!= li.end(); ){
            if (*it % 2)
            {
                it=li.erase(it); //erase函数返回值为删除元素的下一个元素的迭代器(其实就是一个指针),把它赋值给it,就相当于++了。我更喜欢第一种写法。
            }
            else
            {
                it++;
            }
    }

     

  • 相关阅读:
    Linux下pip3安装问题
    客户信息维护jsp
    Java开发环境搭建
    软件开发一般步骤
    PM
    需求分析
    结对编程
    GUI
    spring boot 整合cfx,axis2创建webservice客户端
    webserver 返回json 如何去掉 <string xmlns="http://tempuri.org/">
  • 原文地址:https://www.cnblogs.com/litifeng/p/12960622.html
Copyright © 2011-2022 走看看