文章目录
1.链表list特性
需包含头文件
#include <list>
- 链表由一系列节点组成,节点包含两个域,一个数据域,一个指针域。
- 链表内存是非连续的。
- 添加删除元素,时间复杂度都是常数项,不需要移动元素,比数组添加和删除效率高
- 链表在需要的时候才分配内存
- 只要拿到链表的第一个节点,相当于拿到了整个链表。
- 链表需要额外的空间保存节点关系(前驱、后继)
2.链表list构造函数
//默认构造函数
list<T> lstT;
//构造函数将区间[beg, end)区间区间中的元素拷贝给本身
list(beg, end);
//构造函数将n个elem拷贝给本身
list(n, elem);
//拷贝构造函数
list(const list &lst);
3.链表list数据元素插入、删除操作
//在容器尾部添加一个数据elem
push_back(elem);
//在容器头部插入一个数据elem
push_front(elem);
//删除容器最后一个数据
pop_back();
//删除容器第一个数据
pop_front();
//在pos位置插入elel元素的拷贝,返回新数据的位置
insert(pos,elel);
//在pos位置插入n个elel数据,无返回值
insert(pos, n, elel);
//在pos位置插入[beg, end)区间的数据,无返回值
insert(pos, beg, end);
//移除容器的所有数据
clear();
//删除[beg, end)区间的数据,返回下一个数据的位置
erase(beg, end);
//删除pos位置的数据,返回下一个数据的位置
erase(pos);
//删除容器中所有与elem值匹配的元素
remove(elem);
4.链表list大小操作
//返回容器中元素的个数
size();
//判断容器是否为空
empty();
//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(num);
//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(num,elem);
5.链表list赋值操作
//将[beg, end)区间的数据拷贝给本身
assign(beg, end);
//将n个elem元素拷贝给本身
assign(n, elem);
//重载等号运算符
list& operator= (const list &lst);
//将lst与本身的元素互换
swap(lst);
6.链表list数据的存取
//返回第一个元素
front();
//返回最后一个元素
back();
7.链表list反转、排序
//反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
reverse();
//list排序
sort();
list成员函数sort()
和algorithm
头文件集中包含的sort()
排序:
algorithm
头文件集中包含的sort()
排序,支持可随机访问的容器排序。
而list不支持随机访问,不能使用it+5
,所以list自己提供了自己的排序函数。
8.链表list反转、排序举例
#include <iostream>
#include <list> //list需要包含的头文件
using namespace std;
void print_list(list<int>& lst,int flag)
{
cout<<"print["<<flag<<"]:";
for(list<int>::iterator it = lst.begin();it != lst.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
//回调函数
bool mycompare(int v1, int v2)
{
return v1 > v2;
}
int main()
{
//尾部插入元素
list<int> mlist;
mlist.push_back(6);
mlist.push_back(7);
mlist.push_back(9);
mlist.push_back(2);
mlist.push_back(6);
mlist.push_back(1);
mlist.push_back(0);
mlist.push_back(8);
//打印链表,第一次
print_list(mlist,1);
//链表反转
mlist.reverse();
//打印链表,第二次
print_list(mlist,2);
//排序,默认从小到大
mlist.sort();
//打印链表,第三次
print_list(mlist,3);
//排序,从大到小
mlist.sort(mycompare);
//打印链表,第四次
print_list(mlist,4);
return 0;
}
执行结果:
root@host:/home/LinuxShare/007.STL# g++ 04list.cpp
root@host:/home/LinuxShare/007.STL# ./a.out
print[1]:6 7 9 2 6 1 0 8
print[2]:8 0 1 6 2 9 7 6
print[3]:0 1 2 6 6 7 8 9
print[4]:9 8 7 6 6 2 1 0
9.链表list初始化、插入、删除举例
#include <iostream>
#include <list> //list需要包含的头文件
using namespace std;
void print_list(list<int>& lst,int flag)
{
cout<<"print["<<flag<<"]:";
for(list<int>::iterator it = lst.begin();it != lst.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
int main()
{
list<int> mlist1; //默认构造
list<int> mlist2(10,10); //有参构造
list<int> mlist3(mlist2); //拷贝构造
list<int> mlist4(mlist2.begin(),mlist2.end());
print_list(mlist4,1);
//插入
mlist4.push_back(20);
mlist4.push_front(30);
mlist4.insert(mlist4.begin(),400); //相当于push_front(elem)
mlist4.insert(mlist4.end(),500); //相当于push_back(elem)
list<int>::iterator it = mlist4.begin();
//不能使用it + 2,不支持随机访问
it ++;
it ++;
mlist4.insert(it, 600);
print_list(mlist4,2);
//remove,删除等于指定数值的【所有】元素
mlist4.remove(10);
print_list(mlist4,3);
//删除
mlist4.pop_back(); //删除最后一个
mlist4.pop_front(); //删除第一个
mlist4.erase(mlist4.begin(),mlist4.end()); //删除区间
print_list(mlist4,4);
return 0;
}
执行结果:
root@host:/home/LinuxShare/007.STL# g++ 03list.cpp
root@host:/home/LinuxShare/007.STL# ./a.out
print[1]:10 10 10 10 10 10 10 10 10 10
print[2]:400 30 600 10 10 10 10 10 10 10 10 10 10 20 500
print[3]:400 30 600 20 500
print[4]: