STL详解----list的使用

本文详细介绍了STL中的list,它是一个双向带头循环链表,支持常数时间内任意位置的插入和删除。文章通过实例讲解了如何创建list、遍历list(包括迭代器遍历和范围for遍历)、获取list大小、插入删除元素(如push_back、pop_back、insert和erase)、以及交换、排序和清除操作。特别强调了list不支持随机访问,但在任意位置插入效率高,且排序效率较低。
摘要由CSDN通过智能技术生成

零.前言

学习了vector与string我们可以知道,所谓的STL就是将字符串,数组等数据结构进行严密地封装,方便我们直接使用而不需要进行临时创建,本节将介绍STL中的list,该类是对双向带头循环链表的使用。

1.list的介绍

list表示的是一个双向带头循环链表,允许在常数范围内的任意位置进行插入和删除,且前后可以进行双向迭代。其缺陷和链表一样就是不能支持随机访问(下标访问),但是在任意位置进行插入的效率更高。

2.创建变量

在创建变量之前别忘记包含list的头文件。

	list<int> l1;//创建一个空对象
	list<int> l2(3, 1);//创建一个包含3个1的对象
	list<int> l3(l2);//拷贝构造
	list<int> l4(l3.begin()++, l3.end()--);//在l3.begin()与l3.end()之间创造对象

注意由于l3是链表,因此不能将l3.begin()进行+1等操作。但是可以进行++,–的操作

3.遍历

与list和vector不同,list的遍历不能使用下标遍历,因为他是链表。
但我们可以使用迭代器进行遍历,这里的迭代器是双向迭代器,而不是像list和vector一样是随机迭代器。
双向迭代器的构造使其可以进行++等访问操作,在底层实际上就是操作符重载。

(1)迭代器遍历

	list<int>::iterator it = l3.begin();
	while (it != l3.end())
	{
		*it += 1;
		cout << *it<<" ";
		it++;
	}

同时也支持rbegin与rend,这里不予演示了。

(2)范围for遍历

	for (auto& e : l3)
	{
		cout << e << " ";
	}

使用范围for时,其底层也是迭代器,像vector一样传链表名即可。将迭代器类型改为reverse_iterator即可使用反向迭代器。反向迭代器在string详解中已经介绍过了。

4.list的大小

链表是插入元素,不需要进行提前扩容,因此没有reserve操作。我们可以使用empty来判空,使用size返回大小。

	cout << l1.empty() << endl;
	cout << l3.size() << endl;

在这里插入图片描述

5.插入删除

(1)头尾插删

我们可以使用push_back,push_front,pop_back,pop_front等进行插入和删除。

	l1.push_back(1);
	l1.push_back(2);
	l1.push_back(5);
	l1.push_back(3);
	l1.push_back(4);
	l1.push_front(6);
	l1.push_front(8);
	l1.pop_front();
	l1.pop_back();
	for (auto& e : l1)
	{
		cout << e << " ";
	}

在这里插入图片描述

(2)insert与erase

insert使用:

	auto pos = ++l1.begin();
	l1.insert(pos, 5);//在pos位置前加1个5
	l1.insert(pos, 3, 5);//在pos位置前加3个5
	l1.insert(pos, l3.begin(), l3.end());//将l3加到pos位置前
	for (auto& e : l1)
	{
		cout << e << " ";
	}
	

erase使用:

	l1.erase(pos);//删除pos位置元素
	l1.erase(++l1.begin(), --l1.end());//删除中间内容

在使用erase时要注意迭代器失效问题(迭代器指向节点被删除)。
在这里插入图片描述

6.交换,排序与清除

(1)排序

在vector中我们可以使用algorithm中的sort进行排序,而在list中只能使用list提供的sort,这是因为算法中的sort传参只能传随机迭代器,而list中是双向迭代器。
我们拿上方代码没erase的时候进行排序:

	l1.sort();
	for (auto& e : l1)
	{
		cout << e << " ";
	}

在这里插入图片描述
链表的排序效率过低,如果要排序尽量使用vector不要使用list。

(2)交换

将两个链表中内容进行交换的函数:

	l1.swap(l3);

在这里插入图片描述

(3)清除

清空链表中元素。

l1.clear();

在这里插入图片描述

7.总结

list的使用与vector基本一致,但是底层的实现却大相径庭,要真正理解list我们还需要多去阅读STL的源代码,可以尝试着模拟实现一下list类。

STL listC++标准模板库中的一个双向链表容器,它提供了一系列接口用于操作和管理链表中的元素。下面是一些常见的STL list接口: 1. 构造函数: - list(size_type n, const value_type& val = value_type()):构造包含n个值为val的元素的list。 - list():构造一个空的list。 - list(const list& x):拷贝构造函数,用于复制另一个list的内容构造新的list。 - list(InputIterator first, InputIterator last):用[first, last)区间中的元素构造list。 2. 容器大小: - size():返回list中元素的个数。 - empty():检查list是否为空。 3. 元素访问: - front():返回list中第一个元素的引用。 - back():返回list中最后一个元素的引用。 4. 插入和删除元素: - push_front(const value_type& val):在list的开头插入一个元素。 - pop_front():移除list的第一个元素。 - push_back(const value_type& val):在list的末尾插入一个元素。 - pop_back():移除list的最后一个元素。 - insert(iterator position, const value_type& val):在指定位置之前插入一个元素。 - erase(iterator position):移除指定位置的元素。 - erase(iterator first, iterator last):移除[first, last)区间中的元素。 5. 元素操作: - clear():移除list中的所有元素。 - remove(const value_type& val):移除所有等于val的元素。 - unique():移除所有相邻重复的元素。 - sort():对list中的元素进行排序。 - reverse():反转list中元素的顺序。 你可以参考C++官方文档(https://cplusplus.com/reference/list/list/)了解更多关于STL list的接口和用法。
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卖寂寞的小男孩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值