c/c++语言开发共享C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))

C++ STL容器初学使用时,遍历删除某值元素一定要注意以下几点:错误示范:修改方法一:修改方法二:两种正确编码对其它STL容器一样有效,区别在于: 第一种修改是 it 先++,指向下一个迭代器,再释放之前的迭代器,类似于:因为是值传递,在节点被析构之前,it已经安全地跳转到下一个节点,这里强调一下,值传递原因,erase函数调用和it++是同时的,可能和编译器有关,代码理论上是先调用完函数再做++操作,可能代码在将it值赋值到传参时就回头做++了,之后再执行erase里

C++ STL容器初学使用时,遍历删除某值元素一定要注意以下几点:

错误示范:

C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))

修改方法一:

C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))

修改方法二:

C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))

两种正确编码对其它STL容器一样有效,区别在于: 第一种修改是 it 先++,指向下一个迭代器,再释放之前的迭代器,类似于:

C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))

因为是值传递,在节点被析构之前,it已经安全地跳转到下一个节点,这里强调一下,值传递原因,erase函数调用和it++是同时的,可能和编译器有关,代码理论上是先调用完函数再做++操作,可能代码在将it值赋值到传参时就回头做++了,之后再执行erase里的命令。

而第二种方法,则是根据erase函数返回删除节点的下一个节点的特性,将下一个节点的迭代器赋值给it。

两种方法都是正确的,个人更推荐第二种方法。

 

测试代码:

#include <stdio.h>
#include <list>

int main()
{
    std::list<int> listNum(10, 1);
    for (auto it = listNum.begin(); it != listNum.end();)
    {
        if (*it == 1)
        {
            it = listNum.erase(it);
        }
        else
            it++;
    }
}

c/c++开发分享C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))地址:https://blog.csdn.net/qq_24977505/article/details/107484191

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/598567.html

(0)
上一篇 2021年5月8日
下一篇 2021年5月8日

精彩推荐