【C++初阶】list的使用

本文详细介绍了C++中list容器的基本操作,包括构造、迭代器的使用、插入和删除元素、查找、排序、去重以及splice和remove等成员函数的应用。重点讨论了list作为双向链表的特性,如头插头删、尾插尾删和插入查找等操作。
摘要由CSDN通过智能技术生成

大家好我是沐曦希💕

一、前言

list本质是带头双向循环链表,本文只对list的一些常用接口进行说明,对于其他一些接口可自行查看文档C++ Reference
在这里插入图片描述
在这里插入图片描述

二、构造

在这里插入图片描述

构造函数( (constructor))接口说明
list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
list()构造空的list
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list
void testlist1()
{
	list<int> lt1; // 无参构造
	list<int> lt2(5, 1); // n个val构造
	list<int> lt3(lt2.begin(), lt2.end()); // 迭代器区间构造
	list<int> lt4(lt3); // 拷贝构造
}

在这里插入图片描述

三、迭代器

在这里插入图片描述

函数声明接口说明
begin + end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin +rend返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置

在这里插入图片描述

void testlist2()
{
	//正向迭代器
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	list<int>::iterator it = lt1.begin();
	while (it != lt1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

在这里插入图片描述

void testlist2()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	list<int>::reverse_iterator rit = lt1.rbegin();
	while (rit != lt1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
}

在这里插入图片描述

注意:

1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动

2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

四、增删查改

1.头插头删

在这里插入图片描述
在这里插入图片描述

void testlist3()
{
	list<int> lt;
	lt.push_front(1);
	lt.push_front(2);
	lt.push_front(3);
	lt.push_front(4);
	for (const auto& e : lt)
		cout << e << " ";
	cout << endl;
	lt.pop_front();
	lt.pop_front();
	for (const auto& e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

2.尾插尾删

在这里插入图片描述
在这里插入图片描述

void testlist4()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	for (const auto& e : lt)
		cout << e << " ";
	cout << endl;
	lt.pop_back();
	lt.pop_back();
	for (const auto& e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

3.查找和插入

在list容器中没有提供find函数,可以通过算法库提供find进行查找

#include<algorithm>
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);

在这里插入图片描述

find和insert可以相互配合使用。

在这里插入图片描述

1.通过find找到位置插入
2.找到位置后插入n个val的值
3.找到位置后插入迭代器的区间

void testlist5()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	auto pos = find(lt.begin(), lt.end(), 3);
	// 1.在pos之前插入一个值
	if (pos != lt.end())
		lt.insert(pos, 30); //insert以后pos没有失效
	for (const auto& e : lt)
		cout << e << " ";
	cout << endl;
	cout << *pos << endl;
	// 2.插入n个数据
	pos = find(lt.begin(), lt.end(), 3);
	if (pos != lt.end())
		lt.insert(pos, 4, 10);
	for (const auto& e : lt)
		cout << e << " ";
	cout << endl;
	// 3.插入一个迭代器区间
	vector<int> v(5, 20);
	pos = find(lt.begin(), lt.end(), 10);
	if (pos != lt.end())
		lt.insert(pos, v.begin(), v.end());
	for (const auto& e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

4.删除

在这里插入图片描述

void testlist6()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	auto pos = find(lt.begin(), lt.end(), 3);
	if (pos != lt.end())
		lt.erase(pos);
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
	pos = find(lt.begin(), lt.end(), 4);
	if (pos != lt.end())
		lt.erase(pos, lt.end());
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

注意:对于list的insert的pos位置不会失效,在这个地方,只是在pos位置前增加节点,改变链接,pos位置并不会变成野指针。

五、其他成员函数

1.排序和去重

  • sort

算法库有一个sort函数,但是list自己实现了,因为算法库的sort不能排序list:

算法库里的sort对于物理空间是连续的,只有vector和string能够使用,而对于list来说,物理空间并不是连续的,并不适用,所以list自己提供了一个sort进行排序,此外,链表的排序是归并排序。

在这里插入图片描述

void testlist7()
{
	list<int> lt;
	lt.push_back(12);
	lt.push_back(1);
	lt.push_back(6);
	lt.push_back(9);
	lt.push_back(4);
	lt.push_back(8);
	lt.push_back(10);
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
	lt.sort();
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

  • unique

对于unique:用来删除链表中连续的重复元素,但是注意:一定是要先排完序在进行删除,如果没有进行排序:而直接进行去重的话,会导致去重去不完全
在这里插入图片描述

void testlist8()
{
	list<int> lt;
	lt.push_back(12);
	lt.push_back(9);
	lt.push_back(1);
	lt.push_back(12);
	lt.push_back(12);
	lt.push_back(9);
	lt.push_back(8);
	lt.push_back(9);
	lt.push_back(12);
	lt.unique();
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
	lt.sort();
	lt.unique();
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

2.splice和remove

  • splice

在这里插入图片描述

void testlist9()
{
	//转移到某个位置
	list<int> lt1(5, 10);
	list<int> lt2(4, 7);
	lt1.splice(lt1.begin(), lt2);
	for (auto e : lt1)
		cout << e << " ";
	cout << endl;
	
	//从某个位置转移
	list<int> lt3(4, 10);
	list<int> lt4(4, 5);
	lt3.splice(lt3.begin(), lt4, lt4.begin());
	for (auto e : lt3)
		cout << e << " ";
	cout << endl;

	//迭代器区间转移
	list<int>lt5(3, 10);
	list<int>lt6(3, 20);
	lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end());
	for (auto e : lt5)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

  • remove

在这里插入图片描述
remove可以直接删除list中指定的数据

void testlist10()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(1);
	lt.push_back(1);
	lt.remove(3);
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
	lt.remove(1);
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

3.resize

在这里插入图片描述
list的resize很少用

void testlist11()
{
	list<int> lt(5, 10);
	lt.resize(3);
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
	lt.resize(5);
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
	lt.resize(7, 10);
	for (auto e : lt)
		cout << e << " ";
	cout << endl;
}

在这里插入图片描述

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐曦希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值