STL容器之list

        再讲list之前,我想用一个问题引出list,为什么vector中没有push_front()函数呢?我们习惯了使用push_back,但是vector中却没有push_front() 和 pop_front()函数;因为我们知道,vector是一个顺序容器,所以对于在头部删除元素和插入元素,会使得后面的元素进行移动,从而时间复杂度太大,在此我们也知道了顺序容器的弊端:对于元素的插入删除可能会造成较大的时间复杂度,但是好处就是我们元素可以根据下标进行查找,也可以使用很多我们的查找算法:二分查找等;

        在有些场景中,我们可能需要元素插入和删除频繁的情况下。我们可以使用链表,下面给出链表的数据结构:

        struct list{struct list* next; struct list* pre;  int data}; 这里数据使用int型,也可以使用别的类型;但是我们也知道在stl源码中,我们一切皆是模板,因为要适配其他类型,所以在stl中,我们的list结构是这样;

 

        其实我们从上面的结构可以看出来,list其实本质上是一个双向链表(其实是环形链表),我们可以通过pre和next的指针对于node进行插入和删除;以此,我们可以以list作为底部容器,衍生出stack,queue(配接器)

        由于list是可以前进,也可以后退的,所以我们给list的迭代器型别是Bidirectional;在vector中,插入可能会导致容器扩容,从而进行vector底部的重构,从而使得之前的迭代器失效,但是在list中,由于插入删除(具体操作可百度)是在链表中新增节点,所以之前的迭代器仍然是有效的,因为指向的地方,并未被重构;

        迭代器完成的最重要的操作是对++、--、*等运算符进行重构,可以使得迭代器能够向前、向后访问list中元素,其实迭代器中也就是萃取出来的五种特性,这里的型别是Bidirectional,迭代器的内部肯定还要有一个普通指针指向list节点(前进后退都是使用这个指针来进行移动);

        当然我们在list容器中使用最多的函数是insert和earse,insert配合find找到插入位置之后,在此节点之前插入node即可;

        其实list也提供了sort函数,而且厉害的是排序使用的是quick_sort,而且list中的sort并不能够使用,算法中的sort,要使用自己的sort,因为算法中的sort,迭代器型别的Random,所以要掉用自己的sort函数;

        list就记录在这里了,over。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值