STL之list用法
概述
- STL提供3种顺序容器:vector、list、deque。vector和deque都是基于数组的,list实现链表数据结构。
- list顺序容器提供在容器中任何位置进行插入和删除操作的有效实现方法。因此需要在容器中间或两边经常插入或删除元素的应用程序通常选择list。
- list是双链表,list中的节点包含list上一节点和下一节点的指针。
- list支持双向迭代器,即list可以使用下表内所有的迭代器操作。
具体用法
0. 头文件
#include<list>
1. 声明和初始化
//声明list类的实例list1,存放int值,生成了一个长度为0的空list,容量capacity为0
list<int>list1;
//声明一个list类型的二维链表list1
list<list<int>>list1;
//声明一个list类型的一维链表list1,并将{1,2,3,4}赋值给list1
list<int>list1 = { 1,2,3,4 };
//生成一个链表list1,将list2复制给list1
list<int>list1 = list2;
或 list<int>list1(list2);
或 list<int>list1(list2.begin(), list2.end());
//生成一个链表list1,将数组a的a[0]到a[4]的内容复制给list1
list<int>list1(a, a + 5);
或 list<int>list1(&a[0], &a[4]);
//生成一个链表list1,将大小设为10,且每个元素都为设置为0(默认)
list<int>list1(10);
//生成一个链表list1,将大小设为10,且每个元素都为设置为5
list<int>list1(10, 5);
//将list1清空,然后添加2个元素,每个元素都赋值为10
list1.assign(2, 10);
//声明二维链表list1,将两个一维链表赋值给list1
list<list<int>>list1;
list<int>list2 = { 1,2,3,4 };
list<int>list3 = { 2,4,6,8 };
list1.push_back(list2);
list1.push_back(list3);
2. 常用函数(查询)
2.1 empty()
list1.empty(); //返回值bool类型,若list1为空,则返回true
2.2 size()
list1.size(); //返回值为int类型,list1当前存放的元素的个数
2.3 front()
条件:list1不能为空,否则list1.front()结果是未定义!
list1.front(); //返回list1最前面的元素,即list1[0]
2.4 back()
条件:list1不能为空,否则list1.back()结果是未定义!
list1.back(); //返回list1最末尾的元素,即list1[list1.size()-1]
2.5 迭代器
list的迭代器通常实现为list元素的指针。
//开始指针(正向)
list1.begin()
//结束指针(正向),指向list1最后一个元素的后一位
list1.end()
//开始指针(逆向)
list1.rbegin()
//结束指针(逆向),指向list1最后一个元素的后一位
list1.rend()
//常量开始指针(正向),不能通过该指针来修改所指内容
list1.cbegin()
//常量结束指针(正向),不能通过该指针来修改所指内容,指向list1最后一个元素的后一位
list1.cend()
2.6 输出
//迭代器,顺序访问
for (list<int>::iterator p = nums.begin(); p != nums.end(); p++)
cout << *p << " ";
//输出迭代器,copy算法
ostream_iterator<int> output(cout, " ");
copy(list1.begin(),list1.end(),output);
cout<<endl;
//迭代器,逆序访问
for (list<int>::reverse_iterator p = nums.rbegin(); p != nums.rend(); p++)
cout << *p << " ";
//若是二维链表的输出,顺序访问。注意传入参数是按值传递(不是引用传递&nums)因此在函数里对链表的修改不影响真正的链表的元素。
void display_list_two(list<list<int>> nums) {
while (!nums.empty()) {
for (list<int>::iterator p = nums.front().begin(); p != nums.front().end(); p++) {
cout << *p << " ";
}
cout << endl;
nums.pop_front();
}
}
3. 常用函数(操作)
3.1 push_back()
//在list1末尾添加元素2
list1.push_back(2);
3.2 push_front()
//在list1开头添加元素3
list1.push_front(3);
3.3 pop_front()
//删除list1开头元素
list1.pop_front();
3.4 pop_back()
//删除list1末尾元素
list1.pop_back();
3.5 assign()
//将list1清空,然后将list2元素从头到尾复制给list1
list1.assign(list2.begin(), list2.end());
//将list1清空,然后添加2个元素,每个元素都赋值为10
list1.assign(2, 10);
3.6 insert()
//在list1开头前插入10
list1.insert(list1.begin(),10);
3.7 erase()
//删除list1头部的元素
list1.erase(list1.begin());
//删除list1从头到尾的元素
list1.erase(list1.begin(), list1.end());
3.8 remove()
//删除list1中元素为3的所有副本
list.remove(3);
3.9 swap()
//将list1和list2交换
list1.swap(list2);
3.10 clear()
//清空向量
list1.clear();
3.11 resize()
//重置向量的大小为10
list1.resize(10);
3.12 unique()
条件:已排序的list才能用该函数
//去除重复的元素至只保留一个副本
list1.unique();
3.13 splice()
//将list2加入到list1的末尾,然后删除list2
list1.splice(list1.end(), list2);
3.14 sort()
//排序(默认从小到大)
list1.sort();
3.15 reverse()
//将list1元素翻转
list1.reverse();
3.16 merge()
条件是两个序列已按相同顺序排序
//删除list2所有元素然后将其按顺序插入list1中
list1.merge(list2);
4. 常用算法
4.0 头文件
#include<algorithm>
4.1 copy()
//将list2从头到尾的内容复制给list1
copy(list1.begin(),list2.end(),list1);