【STL】List - 双向链表
list简介
双向链表,可以从任何地方快速插入与删除
线性链表结构,数据由若干节点构成,每一个结点都包括一个信息块(实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,因为list存储在非连续的内存空间中,由指针有序的将元素链接起来
由于结构原因,list的随机检索的性能不好,不像vector那样直接找到元素的地址,而是从头一个一个的顺序查找,这样目标元素越靠后,检索的时间就越长。检索时间与目标元素的位置成正比。
list的优势在于可以迅速地在任何节点进行插入和删除操作。因为list的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不会像Vector会对操作点后的所有元素的存储地址都有所影响
list特点:
(1)不使用连续的内存空间这样可以随意的进行动态操作
(2)可以在内部任何位置快速地插入或删除,也可以在两端进行push和pop
(3)不能进行内部的随机访问,不支持[]操作符和vector.at();
list方法
1.back():返回最后一个元素的引用
2.begin():返回第一个元素的迭代器
3.clear():清除所有元素
4.empty():如果list为空则返回true
5.end():返回末尾的迭代器
6.erase():删除一个元素
iterator erase(iterator loc); // 删除loc处的元素
iterator erase(iterator start,iterator end); // 删除start和end之间的元素
7.front():返回第一个元素的引用
8.get_allocator():返回list的配置器
9.insert():插入一个元素的到list中
iterator insert(iterator loc,const TYPE &val); // 在指定位置loc前插入为val的元素,返回这个元素的迭代器
void insert(ierator loc,const TYPE &val); // 指定位置loc前插入num个值为val的元素
void insert(iterator loc,input_iterator start,input_iterator end); // 在指定位置loc前插入区间[start,end]的所有元素
10.max_size():返回list能容纳的最大元素数量
11.merge():合并两个list
void merge(list &lst); // 把自己个lst链表连接在一起
12.pop_back():删除最后一个元素
13.pop_front():删除第一个元素
14.push_back():在list的末尾添加一个元素
15.push_front():在list的头部添加一个元素
16.rbegin():返回指向第一个元素的逆向迭代器
17.remove():从list删除元素
void remove(const TYPE &val); // 删除链表中所有值为val的元素
18.remove_if():按指定条件删除元素
19.rend():指向list末尾的逆向迭代器
20.resize():改变list末尾的大小
void resize(size_type num,,TYPE val); // 把list的大小改变到num。被加入的多余的元素赋值为val
21.reverse():把list的元素倒转
22.size():返回list中元素个数
23.sort():对list进行排序
void sort(); // 为链表排序,默认为升序
void sort(Comp compfunction); // 采用指定函数compfunction判断两个元素的大小
24.splice():合并两个List
void splice(iterator pos,list &lst); // 把lst连接到pos的位置
void splice(iterator pos,list &lst,iterator del); // 插入lst中del所指元素到现有链表的pos上
void splice(iterator pos,list &lst,iterator start,iterator end); // 使用start和end指定范围
25.swap():交换两个list
void swap(list &lst); // 交换lst和现链表中的元素
26.unique():删除list中所有重复的元素
void unique(); // 删除链表中所有重复元素
void unique(BinPred pr); // 指定pr,则使用pr来判断是否删除
27.assign():给list赋值
void assign(input_iterator start,input_iterator end); // 以迭代器start和end指示的范围为list赋值
void assign(size_type num,const TYPE &val); // 赋值num个为val值得元素
list实例
#include <iostream>
#include <list>
using namespace std;
int cmp(const int& a,const int& b)
{
// 降序序列
return a > b;
}
int main()
{
list<int> li;
for(int i = 10; i >= 6; i--)
{
// 循环压入元素到li
li.push_back(i);
}
// 在list头部添加一个元素3
li.push_front(3);
// 在list尾部添加一个元素20
li.push_back(20);
list<int> li2(li);
for(list<int>::iterator it = li.begin(); it != li.end(); it++)
{
cout<<*it<<' ';
}
cout<<endl;
// 链表排序,默认升序
li.sort();
for(list<int>::iterator it = li.begin();it != li.end(); it++)
{
cout<<*it<<' ';
}
cout<<endl;
// 降序排列,采用cmp来判断两个元素的大小
li2.sort(cmp);
for(list<int>::iterator it = li2.begin();it != li2.end(); it++)
{
cout<<*it<<' ';
}
cout<<endl;
return 0;
}
运行结果: