1.简介
list是一个线性双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。使用时需要包含头文件<list>。
它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。由于其结构的原因,list 随机检索的性能非常的不好,因为它不像vector 那样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后,它的检索时间就越长。检索时间与目标元素的位置成正比。虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有所影响,这一点是vector 不可比拟的。
2.构造
#include <iostream>
#include <list>
int main ()
{
// 下面介绍几种list的构造方法:
std::list<int> first; // 空链表
std::list<int> second (4,100); // 初始化4个值为1的的元素
std::list<int> third (second.begin(),second.end()); // 通过迭代器范围初始化
std::list<int> fourth (third); // 通过另一个list初始化
// 也能通过数组进行初始化:
int myints[] = {16,2,77,29};
std::list<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );
std::cout << "The contents of fifth are: ";
for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); it++)
std::cout << *it << ' ';
std::cout << '\n';
return 0;
}
运行结果:
The contents of fifth are: 16 2 77 29
3.成员函数
3.1迭代器:
begin() | 指向第一个元素位置 |
end() | 指向最后一个元素后一个位置 |
rbegin() | 指向第一个元素之前一个位置 |
rend() | 指向最后一个元素位置 |
3.2容量相关:
size() | 返回容器大小 |
max_size() | 返回容器最大容量 |
empty() | 判断容器是否为空 |
resize() | 调整容量大小,多则删少则补 |
3.3成员访问:
不支持随机访问,其迭代器只有++,--操作,没有+1,-1操作。
front() 返回第一个元素 |
back() 返回最后一个元素 |
3.4元素调整:
assign(4,5) | 对list重新赋值,4个5 |
assign(a.begin(),a.end()) | 使用[a.begin(),a.end())范围的元素对list重新赋值 |
emplace_front () | 向list前端插入元素(c++11新特性,效率比push_front高) |
push_front() | 向list前端插入元素 |
pop_front() | 删除list第一个元素 |
emplace_back () | 向list末尾插入元素(c++11新特性,效率比push_back高) |
push_back() | 向list末尾插入元素 |
pop_back() | 删除list末尾元素 |
insert (iterator position, const value_type& val); | 向position位置插入元素val |
insert (iterator position, size_type n, const value_type& val); | 向position位置插入n个val |
insert (iterator position, InputIterator first, InputIterator last); | 在position位置插入[first,last)范围的元素 |
emplace() | 同insert在position位置插入val的方法(c++11,效率比insert高) |
erase() | 删除指定位置元素:erase (iterator position); 删除位置范围元素:erase (iterator first, iterator last); |
swap() | 交换两个list:list1.swap(list2) |
clear() | 清空list |
3.5相关操作:
sort() | 排序,默认从小到大 |
reverse() | 前后反转元素 |
remove() | 删除所有指定值的元素,remove(val):删除list中所有值为val的元素 |
splice() | 功能有点类似insert,但是插入后原来的list被清空(因为是直接将list2接入list1中) |
merge() | 将两个list按大小顺序合并,如果没有顺序需指定排序函数 |
下面看一下splice的使用例子:
#include <iostream>
#include <list>
int main ()
{
std::list<int> mylist1, mylist2;
std::list<int>::iterator it;
// 设置一些初始值:
for (int i=1; i<=4; ++i)
mylist1.push_back(i); // mylist1: 1 2 3 4
for (int i=1; i<=3; ++i)
mylist2.push_back(i*10); // mylist2: 10 20 30
it = mylist1.begin();
++it; // points to 2
mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
// mylist2 (empty)
// "it" still points to 2 (the 5th element)
mylist2.splice (mylist2.begin(),mylist1, it);
// mylist1: 1 10 20 30 3 4
// mylist2: 2
// "it" is now invalid.
it = mylist1.begin();
std::advance(it,3); // "it" points now to 30
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
// mylist1: 30 3 4 1 10 20
std::cout << "mylist1 contains:";
for (it=mylist1.begin(); it!=mylist1.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
std::cout << "mylist2 contains:";
for (it=mylist2.begin(); it!=mylist2.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
4.非成员函数
1.swap(list1,list2),交换两个list,STL通用算法
2.重载了==,!=,<,>,<=,>= 比较运算符