C++中list

list是双向循环容器,所以利用--it可以对链表尾进行操作,在insert时可以成功地在尾部插入,但是erase时却出错,请问是什么原因

#include<iostream>
using namespace std;
#include<list>

//打印list函数
void printList(list<int> l)
{
    for(list<int>::const_iterator it=l.begin();it !=l.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}

void test01()
{
    //默认构造
    list<int> l;
    for(int i=0;i<10;i++)
    {
        l.push_front(i);//在l1中倒序插入10个数
    }

    list<int>::iterator it=l.begin();
    l.insert(--it,3);          //--it从l的头指向l的尾
    printList(l);

    it = l.begin();
    l.erase(--it);    //这一步出错了
    printList(l);
}

int main()
{

    test01();
    system("pause");
    return 0;
}
111 views
Comments
登录后评论
Sign In
·

个人猜测可能是list的链式存储有关,不可以使用跳跃访问,但为什么it++可以正常呢

·

没有用的知识!最好全都忘掉!

C++标准里从来没有规定过list一定是环形,永远不要利用这个特性来写代码。

否则你就是在为自己或团队埋坑。

·

那老哥说得太对了,我之前没仔细看VS开的是Release模式,前面的insert中的--居然可以正常运行,然后erase的--爆炸了,但实际debug中两种都会进行检查直接就告诉你不可以 decrement,千万不要把ub当知识点,实际操作过程中erase会导致迭代器失效,那么应该使用it = l.erase(it);这种写法获取正确的迭代器,而不是使用莫名巧妙的递增,虽然效果是一样的

·

实际上就是it--之后,指向的迭代器位置是,最后一个元素之后,插入的时候是没问题的,但是删除的时候就不行了,如果想要删除最后一个元素应该改成

it=l.end();

l.erase(--it);

这样就可以了。