list的常用操作

list的介绍

list是序列容器,它允许在常数范围O(1)进行插入和删除在这段序列的任意位置,并且可以双向遍历

它是弥补vector容器的缺点,与vector有互补的韵味,

这里我们可以将其进行与vector进行对比

vector

(1)可以在序列内的任意位置随机访问,这样就很好的支持了二分查找,堆排序等

(2)头部和中间插入和删除的时候效率低,扩容的时候会多扩容空间,一定程度上浪费空间

list

(1)不支持在任意位置随机访问

(2)支持了在任意位置的插入和删除,并且是常数时间O(1)扩容是一个一个链接的不会存在多扩容空间

list的常见使用

list的操作有很多,这里我们只介绍一些比较常用的操作

(1)包头文件

要使用list向将头文件包上

cpp 复制代码
#include<iostream>
#include<list>

using namespace std;

(2)头插头删尾插尾删

list的底层是双向链表自然也就支持头插头删尾插尾删

建立list对象l后,我们就可以进行使用了

cpp 复制代码
list <int> l;

l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);

l.push_front(0);

l.pop_back();
l.pop_front();

(3)list的打印

list的遍历不能使用operator\[\]+下标进行遍历,其根本的物理结构不相同

list的遍历使用迭代器或则范围for进行遍历,其中范围for是编译器自动替换为迭代器iterator进行打印

cpp 复制代码
    list<int>::iterator it = l.begin();
	while (it != l.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : l)
	{
		cout << e << " ";
	}
	cout << endl;

打印(2)中的结果如下

(4)反向打印迭代器

list的底层是双向循环列表,支持反向遍历打印

cpp 复制代码
	list<int>::reverse_iterator rit = l.rbegin();
	while (rit != l.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

运行结果如下

(5)修改

在迭代器以及范围for中我们可以修改list中的值,如下

cpp 复制代码
	list<int>::iterator it = l.begin();
	while (it != l.end())
	{
		*it += 1;
		cout << *it << " ";
		++it;
	}
	cout << endl;

结果如下

(6)仅打印print_list

cpp 复制代码
void print_list(const list<int>& l)
{
	list<int>::const_iterator it = l.begin();
	while (it != l.end())
	{
		//*it += 1;不能更改
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

这里更改的话,编译器会提示错误,原因是const类型的迭代器仅能读,不能写

结果如下

(7)赋值运算符=

cpp 复制代码
	list<int> lt1;
	lt1.push_back(10);
	lt1.push_back(20);
	lt1.push_back(30);
	lt1.push_back(40);

	l = lt1;
	print_list(l);

打印结果为,可知l中的原值1,2,3被赋值为10,20,30,40

(8)查找,插入,删除

cpp 复制代码
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
cpp 复制代码
list<int>::iterator it = find(lt1.begin(),lt1.end(),3);
if (it != lt1.end())
{
	lt1.insert(it, 30);
	lt1.erase(it);
}

结果为,这里有的时候会涉及迭代器的失效,请期待下节

(9)排序

cpp 复制代码
list<int> lt1;
lt1.push_back(3);
lt1.push_back(5);
lt1.push_back(1);
lt1.push_back(6);
lt1.push_back(2);
lt1.push_back(4);

print_list(lt1);

lt1.sort();

结果如下

到这里我们讲解完毕

如果对您有帮助的话点一个免费的赞和收藏叭!

由于作者水平不足,如有任何错误,请读者在评论区交流!

相关推荐
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠3 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦10 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠11 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾11 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82111 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q11 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒11 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
世人万千丶11 天前
成语接龙小应用 - HarmonyOS ArkUI 开发实战-TextInput与List列表-PC版本
华为·list·harmonyos·鸿蒙·鸿蒙系统
WL学习笔记11 天前
单项不带头不循环链表
数据结构·链表