list(一)

news2024/9/23 2:18:40

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。

支持++ -- 但是不支持+和-

 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。

链表的主流访问方式就是迭代器

list构造  

1) 空容器构造函数(默认构造函数)

构造一个没有元素的空容器。

(2) 填充构造函数

构造一个包含 n 个元素的容器。每个元素都是 val 的副本。

(3) 范围构造函数

构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都按相同的顺序从该区域中的相应元素构造。

(4) 复制构造函数

以相同的顺序构造一个容器,其中包含 x 中每个元素的副本。

int main()
{
	
	std::list<int> first;                   //空构造           
	std::list<int> second(4, 100);                  //4个值为100的构造   
	std::list<int> third(second.begin(), second.end()); //范围构造
	std::list<int> fourth(third);                      //拷贝构造

	
	int myints[] = { 16,2,77,29 };
	std::list<int> fifth(myints, myints + sizeof(myints) / sizeof(int));//也可以使用其他容器进行范围构造

	std::cout << "The contents of fifth are: ";
	for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); it++)
		std::cout << *it << ' ';

	std::cout <<endl;

	return 0;
}
void list1()
{
	list<int>l1 = { 1,2,3,4,5,6 };
	list<int>::iterator it = l1.begin();
	while(it != l1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

}

list迭代器

【注意】
1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

list的begin()指向头结点的下一个结点 也就是第一个有效元素的结点  end()指向头节点 也就是最后有效元素的下一个结点   rbegin()指向头结点   rend()指向头节点的下一个结点

list的成员函数empty是检测链表是否为空 并且返回布尔值  若为空 返回1 若不为空 返回0

返回链表容器中的元素数

front 和back 分别返回链表的第一个有效元素 和最后一个有效元素  有const和非const两个版本

list::push_front (const vallue_type & val)   list ::push_back(const value_type& val)

分别对链表进行头插 和尾插

list::pop_front ()   list ::pop_back()

分别对链表进行头删和尾删

(1)通过在指定位置插入单个元素

  (2)   通过在指定的位置插入 n个相同的val元素

(3)通过在指定的位置 范围插入一段内容

(1)在指定位置删除单个元素

(2)在指定的范围内删除所有元素

迭代器失效即迭代器所指向的节点的无效,即该节
点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代
器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

list无法使用alogrithm库 中的sort进行排序 

void list1()
{
	list<int>l1 = { 1,2,3,4,5,6 };
	list<int>::iterator it = l1.begin();
	while(it != l1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	sort(l1.begin(),l1.end());
}

原因是sort底层是快排 要使用随机迭代器 但是list是双向迭代器

那么链表如何排序呢

在链表的成员函数中存在专门为链表排序的sort成员函数

void list1()
{
	list<int>l1 = { 1,2,3,4,5,6 ,1,3,4};
	list<int>::iterator it = l1.begin();
	while(it != l1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	//sort(l1.begin(),l1.end());
	l1.sort();
	list<int>::iterator it1 = l1.begin();

	while (it1 != l1.end())
	{
		cout << *it1 << " ";
		it1++;
	}
}

这是默认升序 如果想要降序那么就要传仿函数作为参数进入

void list1()
{
	list<int>l1 = { 1,2,3,4,5,6 ,1,3,4};
	list<int>::iterator it = l1.begin();
	while(it != l1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	//sort(l1.begin(),l1.end());
	l1.sort();
	list<int>::iterator it1 = l1.begin();

	while (it1 != l1.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
	//greater<int>gt;
	l1.sort(greater<int>());
	for (auto e:l1)
	{
		cout << e << " ";
	}
	cout << endl;
}

在现在的链表中是存在重复的数据的 如果想要去重该如何

有专门的去重成员函数unique

void list1()
{
	list<int>l1 = { 1,2,3,4,5,6 ,1,3,4};
	list<int>::iterator it = l1.begin();
	while(it != l1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	//sort(l1.begin(),l1.end());
	l1.sort();
	list<int>::iterator it1 = l1.begin();

	while (it1 != l1.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
	//greater<int>gt;
	l1.sort(greater<int>());
	for (auto e:l1)
	{
		cout << e << " ";
	}
	cout << endl;
	l1.unique();
	for (auto e : l1)
	{
		cout << e << " ";
	}
	cout << endl;
}

但是list.sort排序的效率相较于快速排序的sort的效率还是非常低的 这点需要注意

拼接(转移)

接合

第一个版本 (1) 将 x 的所有元素传输到容器中。
第二个版本 (2) 仅将 i 指向的元素从 x 传输到容器中。
第三个版本 (3) 将范围 [first,last] 从 x 传输到容器中

void list2()
{

	std::list<int> mylist1, mylist2;
	std::list<int>::iterator it;

	// set some initial values:
	for (int i = 1; i <= 4; ++i)
		mylist1.push_back(i);      // mylist1: 1 2 3 4

	for (int i = 1; i <= 3; ++i)
		mylist2.push_back(i * 10);   // mylist2: 10 20 30

	it = mylist1.begin();
	++it;                         // points to 2

	mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4
	for (auto e:mylist1)
	{
		cout << e << " ";
	}
	cout << endl;
}

这里使用的是第一个版本 将lsit容器x的全部元素插入 到 mylist1的pos位置  且此时链表二中被转移的内容是不会在存在在链表二的 相当于是转移

链表中不存在find 所以想要使用find需要使用算法库中的find

第一个参数和第二个参数确定查找的范围 第三个元素是要查找的元素

void list3()
{
	list<int> mylist1;
	for (int i = 1; i <= 4; i++)
		mylist1.push_back(i);
	auto it = find(mylist1.begin(),mylist1.end(),3);
	mylist1.splice(mylist1.begin() , mylist1,it);
	for (auto e : mylist1)
	{
		cout << e << " ";
	}
	cout << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:终端(terminal)与终端管理器(agetty)

终端的设备文件 打开/dev目录可以发现其中有许多字符设备文件&#xff0c;例如对于我的RedHat操作系统&#xff0c;拥有tty0到tty59&#xff0c;它们是操作系统提供的终端设备。对于tty1-tty12使用ctrlaltF*可以进行快捷切换&#xff0c;下面的命令可以进行通用切换。 sudo ch…

校园热捧的“人气新贵”,D 咖智能饮品机器人

在 2024 年的校园中&#xff0c;一股全新的潮流正在悄然兴起。D 咖智能饮品机器人以其独特的魅力&#xff0c;成功入驻多个校园&#xff0c;迅速成为学生们热烈追捧的对象&#xff0c;在长江大学、荆州职业技术学院、中医高专等多个大学校园&#xff0c;都能发现他们靓丽的身姿…

calibre-web报错:File type isn‘t allowed to be uploaded to this server

calibre-web报错&#xff1a;File type isnt allowed to be uploaded to this server 最新版的calibre-web在Upload时候会报错&#xff1a; File type isnt allowed to be uploaded to this server 解决方案&#xff1a; Admin - Basic Configuration - Security Settings 把…

投资学 01 定义,投资

02. 03. 3.1 直接投资&#xff1a;使用方和提供方是一个人

VUE3学习---【一】【从零开始的VUE学习】

目录​​​​​​​ 什么是Vue 渐进式框架 创建一个Vue应用 什么是Vue应用 使用Vue应用 根组件 挂载应用 模板语法 文本插值 原始HTML Attribute绑定 简写 同名简写 布尔型Attribute 动态绑定多个值 使用JavaScript表达式 仅支持表达式 指令 Directives 指令…

COLORmap

在这段MATLAB代码中&#xff0c;surf(peaks)、map的定义以及colormap(map)的调用共同完成了以下任务&#xff1a; 1. **绘制曲面图**&#xff1a; - surf(peaks)&#xff1a;这个函数调用了MATLAB内置的peaks函数来生成数据&#xff0c;并使用surf函数将这些数据绘制成一个…

双向链表:实现、操作与分析【算法 17】

双向链表&#xff1a;实现、操作与分析 引言 双向链表&#xff08;Doubly Linked List&#xff09;是链表数据结构的一种重要形式&#xff0c;它允许节点从两个方向进行遍历。与单向链表相比&#xff0c;双向链表中的每个节点不仅包含指向下一个节点的指针&#xff08;或引用&…

蓝桥杯嵌入式的学习总结

一. 前言 嵌入式竞赛实训平台(CT117E-M4) 是北京国信长天科技有限公司设计&#xff0c;生产的一款 “ 蓝桥杯全国软件与信息技术专业人才大赛-嵌入式设计与开发科目 “ 专用竞赛平台&#xff0c;平台以STM32G431RBT6为主控芯片&#xff0c;预留扩展板接口&#xff0c;可为用户提…

数据结构篇--顺序查找【详解】

概念章 查找就是在数据集合中寻找某种条件的数据元素的过程。 查找表是指用于查找同一类型的数据元素集合。 找到了满足条件的数据元素&#xff0c;就是查找成功&#xff0c;否则就是称为查找失败。 关键字是指数据元素的某个数据项的值&#xff0c;可用于标识或者记录&…

【Java】线程暂停比拼:wait() 和 sleep()的较量

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在Java多线程编程中&#xff0c;合理地控制线程的执行是至关重要的。wait()和sleep()是两个常用的方法&#xff0c;它们都可以用来暂停线程的执行&#xff0c;但它们之间存在着显著的差异。本文将详…

【AI学习笔记】初学机器学习西瓜书概要记录(二)常用的机器学习方法篇

初学机器学习西瓜书的概要记录&#xff08;一&#xff09;机器学习基础知识篇(已完结) 初学机器学习西瓜书的概要记录&#xff08;二&#xff09;常用的机器学习方法篇(持续更新) 初学机器学习西瓜书的概要记录&#xff08;三&#xff09;进阶知识篇(待更) 文字公式撰写不易&am…

Django 基础之启动命令和基础配置

Django启动 django启动一般可以通过ide或者命令启动 ide启动&#xff1a; 启动命令&#xff1a; python manage.py runserver该命令后续可以增加参数&#xff0c;如&#xff1a; python manage.py runserver 8081 python manage.py runserver 127.0.0.1:8082 注意&#xff1…

StopIteration: 迭代停止完美解决方法 ️

&#x1f504; StopIteration: 迭代停止完美解决方法 &#x1f6e0;️ &#x1f504; StopIteration: 迭代停止完美解决方法 &#x1f6e0;️摘要引言正文1. 什么是StopIteration异常&#xff1f;&#x1f4dc;2. StopIteration在for循环中的处理机制&#x1f6a6;3. 如何自定…

数仓规范:命名规范如何设计?

目录 0 前言 1 表命名规范 2 字段命名规范 3 任务命名规范 4 层级命名规范 5 自定义函数命名规范 6 视图和存储过程的命名规范 7 综合案例分析 8 常见陷阱和如何避免 9 工具和最佳实践 10 小结 想进一步了解数仓建设这门艺术的&#xff0c;可以订阅我的专栏数字化建设…

深度学习02-pytorch-03-张量的数值计算

张量&#xff08;Tensor&#xff09;是多维数组的通用化概念&#xff0c;它可以表示标量&#xff08;0维&#xff09;、向量&#xff08;1维&#xff09;、矩阵&#xff08;2维&#xff09;以及更高维度的数据。在深度学习和数值计算中&#xff0c;张量是基础数据结构&#xff…

[Python学习日记-27] 文件操作练习题解析

[Python学习日记-27] 文件操作练习题解析 简介 练习题1——全局替换程序 练习题2——模拟登陆 简介 练习题1——全局替换程序 一、题目 写一个脚本&#xff0c;允许用户按以下方式执行时填入参数&#xff0c;即可以对指定文件内容进行全局替换 python your_script.py old…

Mybatis in用法优化

如果in的参数过多&#xff0c;mybatis会报错 原来写法&#xff1a;select * from file_inf a <where>and a.status 0 and a.id in<foreach collection"ids" open"(" close")" separator"," item"id" #{id}</for…

ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案

具体报错&#xff1a; Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘CommissionMapperImpl’ for bean class [com.xxx.mapper.carrier.CommissionMapperImpl] conflicts with existing, non-co…

MAC激活Typora以及禁止成功激活弹窗的方法

激活 Typora 首先在官网下载 Typora 的最新版 并且安装。 打开以下目录 /Applications/Typora.app/Contents/Resources/TypeMark/page-dist/static/js/ 注意在 Applications 中&#xff0c;需要对 Typora 右键选择 Show Packages Contents 即可进入 Typora.app。 在该目录的文…

探索未来智能:Moonshot AI 引领AI新纪元——M1超级模型

在人工智能的快速演进中&#xff0c;Moonshot AI再次站在了技术创新的前沿。推出M1超级模型&#xff0c;这是一款旨在突破现有AI能力极限的革命性产品。 M1超级模型的诞生背景 随着数据量的爆炸性增长和计算能力的提升&#xff0c;AI模型正变得越来越复杂和强大。M1超级模型…