STL_链表list容器

1.链表list特性

需包含头文件

#include <list>
  1. 链表由一系列节点组成,节点包含两个域,一个数据域,一个指针域。
  2. 链表内存是非连续的。
  3. 添加删除元素,时间复杂度都是常数项,不需要移动元素,比数组添加和删除效率高
  4. 链表在需要的时候才分配内存
  5. 只要拿到链表的第一个节点,相当于拿到了整个链表。
  6. 链表需要额外的空间保存节点关系(前驱、后继)
    在这里插入图片描述

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]
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值