list的使用

1:list文档

list文档

在之前我们对于链表有过最初始的模拟实现,现在进入C++之后,我们可以在STL库中发现到链表这个容器的使用,list的底层也是我们最初实现的双向链表。

2:list的使用

list的接口有很多,我们需要先掌握其中一部分的接口,然后了解其底层,为以后的可扩展使用接口做铺垫

1:list的构造

2:list的迭代器

注意:

1:begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2:rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

3:list capacity

4:list element access

5:list modifires

3:list的迭代器失效问题

我们在之前的vector和string里面知道了迭代器可以失效,我们现在来探索一下再list中迭代器是如何失效的

前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

void TestListIterator1()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    list<int> l(array, array + sizeof(array) / sizeof(array[0]));
    auto it = l.begin();
    while (it != l.end())
    {
        // erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值
            l.erase(it);
        ++it;
    }
}
// 改正
void TestListIterator()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    list<int> l(array, array + sizeof(array) / sizeof(array[0]));
    auto it = l.begin();
    while (it != l.end())
    {
        l.erase(it++); // it = l.erase(it);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值