共计 1986 个字符,预计需要花费 5 分钟才能阅读完成。
一、前言
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;
}
后果如下:
正文完