C++ List

C++ List,第1张

参考

参考别人资料,按照抄写测试重新排序和注释
原文链接
原文链接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 
	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();

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1330189.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存