一、前言
list容器,又称为双向链表容器,即该容器的底层是以双向链表的模式实现的,因而list容器中的元素能够扩散存储在内存空间里,而不是必须存储在一整块间断的内存空间中。
list容器中各个元素的前后程序是靠指针维系的,每个元素都有两个指针,别离指向它的前一个元素和后一个元素。第一个元素的前向指针总为 null,因为它后面没有元素;同样,尾部元素的后向指针也总为 null。
长处:能够在序列已知的任何地位疾速插入或删除元素(工夫复杂度为O(1))。并且在 list 容器中挪动元素,也比其它容器的效率高。
毛病:不能通过下标拜访元素,只能从容器中第一个元素或最初一个元素开始遍历容器,直到找到对应元素。
list 容器以模板类 list<T>(T 为存储元素的类型)的模式在<list>头文件中,并位于 std 命名空间中。应用时需蕴含头文件:
#include <list>using namespace std;
二、初始化list容器
一共有5种形式创立list容器
①std::list<int> listInt;②std::list<int> listInt(10);③std::list<int> listInt(10, 5);④std::list<int> listInt2(listInt);⑤//拷贝一般数组,创立list容器int a[] = { 1,2,3,4,5 };std::list<int> listInt(a, a+5);//拷贝其它类型的容器,创立 list 容器std::array<int, 5> arrInt{ 11,12,13,14,15 };std::list<int> listInt(arrInt.begin()+2, arr.end());
①创立空的list容器
②创立一个蕴含10个元素,默认值为0的list容器
③创立一个蕴含10个元素,初始值为5的list容器
④将以初始化的list容器进行拷贝创立新的list容器,须保障新旧容器存储的元素类型统一
⑤通过拷贝其余类型容器(或者一般数组)中指定区域内的元素,创立 list 容器
三、成员函数
这里不列举迭代器、增加和删除等相干的函数。
函数 | 性能 |
---|---|
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false |
size() | 返回以后容器理论蕴含的元素个数 |
max_size() | 返回容器所能蕴含元素个数的最大值,个别是 232-1 |
front() | 返回第一个元素的援用 |
back() | 返回最初一个元素的援用 |
assign() | 用新元素替换容器中原有内容 |
swap(x,y) | 替换两个容器中的元素,必须保障这两个容器中存储的元素类型是雷同的 |
resize() | 调整容器的大小 |
splice() | 将一个 list 容器中的元素插入到另一个容器的指定地位 |
merge() | 合并两个当时已排好序的 list 容器,并且合并之后的 list 容器仍然是有序的 |
sort() | 通过更改容器中元素的地位,将它们进行排序 |
reverse() | 反转容器中元素的程序 |
四、实例
1、创立list容器
std::list<int> listInt; listInt.push_back(31); listInt.push_back(27); listInt.push_back(29); std::cout << " listInt size: " << listInt.size() << std::endl; int i = 0; std::list<int>::iterator listIter = listInt.begin(); for (; listIter != listInt.end(); listIter++) { std::cout << " listInt[" << i++ << "]=" << *listIter << std::endl; } listInt.sort(); i = 0; listIter = listInt.begin(); for (; listIter != listInt.end(); listIter++) { std::cout << " sort listInt[" << i++ << "]=" << *listIter << std::endl; } int nFront = listInt.front(); int nBack = listInt.back(); std::cout << " listInt front: " << nFront << " back: " << nBack << std::endl; std::list<int> listInt1{ 14,25,99 }; listInt1.sort(); listInt.merge(listInt1); i = 0; listIter = listInt.begin(); for (; listIter != listInt.end(); listIter++) { std::cout << " merge listInt[" << i++ << "]=" << *listIter << std::endl; }
后果如下: