再讲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。