与vector一样,list也是STL模板库中提供的序列式容器之一。不同的是,list是由双向链表来实现的,元素与元素之间的地址不一定是连续的,,元素之间的序列关系由指针维护。list支持前后两种移动方式。与vector不同,list不支持随机访问,不可以使用operator[] 或at()来获取元素。list的优势在于任何位置执行插入和删除操作都非常迅速,因为改变的仅仅是指针与节点的链接而已。list的使用需要头文件和std命名空间。
list对象的定义与构造函数
list对象的定义与初始化一般有一下几种方法:
1 | list<TYPE> mylist; //初始化一个空lkongist |
基础成员函数
元素的赋值
list模板类提供了两个成员函数push_back()
,push_front()
,分别用来将新的节点追加到list的尾部和插入到list的头部。与之对应的pop_back()
和pop_front()
函数则是在相应位置做删除操作。在vector中只提供了push_back()
函数和pop_back()
函数,主要是因为vector中在头部插入和删除元素效率很低,所以就没有直接提供相应操作,这也说明了list是双向链表。
list容器的容量
和list容量相关的主要是下面的几个函数:
1 | mylist.size(); //返回容器中元素的个数 |
迭代器相关
list模板类包含的和迭代器相关的函数主要有:begin(),end(),rbegin(),rend(),back(),front()
下面我们通过一个程序演示他们的使用:
1 |
|
输出:
1 | 1 2 3 4 |
判断链表是否为空
使用list对象的empty()方法判断链表是否为空,该函数返回bool值
list元素的存取与访问
list对象不能使用operator[]和at()来实现随机访问,但是可以用迭代器来进行元素的访问。
元素的插入与删除
可以实现list元素插入与删除的函数有:
1 | //在链表尾端插入 |
运算符函数
operator==,operator<,operator>,operator<=,operator>=,operator!=这些运算符函数均可以用于两个list对象之间的比较,前提是参与比较的两个list对象的格式应该完全相同。
合并两个list
list还提供了成员函数merge()成员函数,用于将两个具有相同格式的list对象合并,同时提供了sort()成员函数用于将成员排序:
1 |
|
输出:
1 | abc def ghi |
unique()重复的元素只保留一个
1 |
|
输出:
1 | 1 2 1 |
reverse()反转顺序
1 |
|
输出:
1 | 1 2 3 |