C++ List

参考

参考别人资料,按照抄写测试重新排序和注释
原文链接
原文链接2

List的优缺点

摘自大佬

List 的能力

List的内部结构与vector和deque完全不同,List对象提供了两个pointer,分别指向前后元素。因此,List在几个方面与vector和deuqe不同:
  1.List不支持随机访问,因此访问元素的效率较低;
  2.任何位置上,执行元素的插入和移除都很快,始终是常量时间内完成,因为无需移动任何元素;
  3.安插和删除的操作不会因此指向其他元素的pointer、reference、iterator失效;
  4.List对异常的控制是,要么操作成功,要么什么都不发生。

List 操作

List容器提供的一般STL所具备的通用能力,但相比于vector和deque具有如下不同——
  1.由于不支持随机访问,所以List没有at函数和下标操作符;
  2.List并未提供容量、空间重新分配等操作的函数,因为没有必要,每个元素有自己的内存,在元素被删除前一直有效;
  3.List提供不少特殊成员函数,专门用于移动和移除元素,较之同名的STL通用算法,这些函数执行起来更加迅速,因为他们只需要调整几个pointer即可。

初始化函数

声明一个空的链表

	std::list <int > IList0;      

建立一个有9个元素的链表,链表默认值为0

	std::list <int > IList1(9);   

创建一个具有5个元素的链表,默认值为1

	std::list <int > IList2(5, 1); 

拷贝一个链表,值为IList2

	std::list <int > IList3(IList2);

建立一个链表,链表的长度为从IList2开始到++IList2.begin()终止,但不包含++IList2.begin()

	std::list <int > IList4(IList2.begin() , ++IList2.begin());

添加数据

头部插入

IList0.push_front(1);

尾部插入

IList0.push_back(3);

插入
在begin前面插入

IList0.insert(IList0.begin(),0);

运行结果
在这里插入图片描述

删除

list接口

头部删除

	IList0.pop_front();		

尾部删除

	IList0.pop_back();		

清空

IList0.clear();

程序示例
在这里插入图片描述

迭代器删除

	i = IList0.erase(i);

在这里插入图片描述
删除除相同元素

void remove(const Type& _Val);

自定义删除,满足条件返回true删除,否则不删除

bool marger(int & x )
{
	if (x>3)
	{
		return true;
	}
	return false;
}
IList0.remove_if(marger);		    

重置元素

重置为5个元素,每个元素的值为5

	IList0.assign(5, 5);

清空list1并且 将list0的元素从0开始到end–结束,不包含end–

IList1.assign(IList0.begin(), --IList0.end());

是否为空

为空返回true,不为空范围false

IList0.empty()

调整大小

将list的数量调整为5个 多余的删除掉,少于的则会用0补齐

	IList0.resize(5);	

将list的数量调整为5个 多余的删除掉,少于的则会用8补齐

	IList0.resize(1, 8);	

遍历

迭代器遍历

	for (auto i = IList.begin(); i != IList.end(); i++)

这里没有深挖,使用底层接口遍历

	#include <algorithm>
	for_each(IList0.begin(), IList0.end(), print); 

合并

自定义合并,默认不输入函数指针则从大到小,如果有函数指针则如果为true就把x放前面 否则把y放前面

bool marger(int & x,int &y )
{
	if (x>y)
	{
		return true;
	}
	return false;
}
IList0.merge(IList2, marger);

从L1末尾开始添加L2,并且清空L2

L1.splice(L1.end(), L2);

从L1,末尾开始添加L0,开始添加的数据未从(++L0.begin())开始,并且清空(++L0.begin())之后的数据

L1.splice(L1.end(), L0, (++L0.begin()));

从L1的++L1.begin()开始添加L3的数据,数据的开始和 结束位置为L3.begin(), ++L3.begin();但不包括++L3.begin();并且L1的数据添加位置开始数据会向后移动,同样原理:L3的L3.begin()到++L3.begin()的数据会被移除

L1.splice(++L1.begin(), L3, L3.begin(), ++L3.begin());

排序

如果不传入函数指针默认从小到大排序,否则返回true为把x方前面,false为把y放前面

bool marger(int & x,int &y )
{
	if (x>y)
	{
		return true;
	}
	return false;
}
	IList0.sort(marger);		      //所有元素自动按从大到小排序

反转

与原来相反的顺序

IList0.reverse();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值