C++-list使用学习

news2024/9/28 10:00:02

###list(链表)是C++里面的一种容器,底层是双向的;

 这就决定了它的迭代器使用的场景和能够使用的算法;双向(例如list)不能像随机(例如vector)那样用迭代器任意加上几去使用,list只能加加或者减减;

而对于按性质分类而不同类别的容器来说,它们能够使用的算法也是不一样的,随机性质的相当于具备其他性质的迭代器的特性,都可以使用,但是单向性质的只能使用单向的,同理双向性质的(list)则可以使用单向的和双向的,不能使用随机的

一、list的初始化

list初始化分为五种:

  1. 无参初始化,初始化的list对象为空;
  2. n个val去初始化;
  3. 利用容器对象的一段迭代器区间初始化;
  4. 拷贝初始化;
  5. 利用数组初始化。

###代码示例:

void test()
{
	//list初始化
	list<int> l1;	//无参
	list<int> l2(10, 1);	//n个 val
	list<int> l3(l2);	//拷贝
	list<int> l4(++l2.begin(), --l2.end());		//迭代器区间
	cout << "l1:" << endl;
	list_print(l1);
	cout << "l2:" << endl;
	list_print(l2);
	cout << "l3:" << endl;
	list_print(l3);
	cout << "l4:" << endl;
	list_print(l4);

	int arr[10] = { 1,2,3,4,5 };
	list<int> l5(arr, arr + sizeof(arr) / sizeof(arr[0]));	//利用数组
	cout << "l5:" << endl;
	list_print(l5);
}


二、其他接口介绍

1、emplace_back和push_back的区别

emplace_back也是尾插数据,但是可以直接传值去尾插,这样省去来拷贝构造的步骤,有一点优化;而push_back不能直接传值去初始化;

###代码示例:

void test()
{
	list<A> l1;
	l1.push_back(A(2, 2.2));
	cout << "****************" << endl;
	list<A> l2;
	l2.emplace_back(2, 2.2);//可以直接给值
}

 2、insert和erase

insert:

  1. 用迭代器指定一个位置,在此位置之前插入数据;(返回值是指向原来数据的迭代器)
  2. 在指定位置之前插入n个数据;
  3. 在指定位置插入一段迭代器区间内的数据,这个迭代器可是不同的容器。
void test()
{
	list<int> mylist;
	for (int i = 1; i < 5; i++)
	{
		mylist.push_back(i);	//1 2 3 4 5
	}
	list<int> :: iterator it = mylist.begin();
	it++;//现在指向 mylist 里面的数据2
	mylist.insert(it, 99);//1 99 2 3 4 5 现在it还是指向2
	mylist.insert(it, 9);
	list_print(mylist);
	it--;//指向9
	mylist.insert(it, 3, 0);//插入三个0;
	list_print(mylist);

	vector<int> v(3, 100);
	mylist.insert(mylist.begin(), v.begin(), v.end());//插入一段迭代器区间的数据
	list_print(mylist);
}

 erase:

  1. 删除指定位置的数据,返回值是指向这个待删除元素之后的下一个数据的迭代器,若是这个待删除的数据为list里面的最后一个数据,那么返回值就是list的end;
  2. 删除一段迭代器区间的数据。
void test()
{
	list<int> mylist;
	for (int i = 1; i <= 5; i++)
	{
		mylist.push_back(i);	//1 2 3 4 5
	}

	list<int> ::iterator it = mylist.begin();
	it = mylist.erase(it);//删除it处的数据 :2 3 4 5
	cout << *it << endl;
	list_print(mylist);

	mylist.insert(mylist.begin(), 1);//恢复
	it = mylist.begin();
	it++;
	it++;//现在指向3
	it = mylist.erase(mylist.begin(),it);
	cout << *it << endl;
	list_print(mylist);
}

3、unique(去重)

  1. 无参的:删除一串连续数据里面除了第一个以外的其他的相同的元素;只有当这个元素前面的元素和它相同时才会删除这个元素,也就是说,这个函数用于有序的数据; 
void test()
{
	list<int> mylist;//有序
	mylist.push_back(1);
	mylist.push_back(1);
	mylist.push_back(2);
	mylist.push_back(3);
	mylist.push_back(4);
	mylist.push_back(4);
	list_print(mylist);
	mylist.unique();
	list_print(mylist);

	list<int> mylist1;//无序
	mylist1.push_back(1);
	mylist1.push_back(2);
	mylist1.push_back(3);
	mylist1.push_back(2);
	mylist1.push_back(5);
	mylist1.push_back(4);
	list_print(mylist1);
	mylist1.unique();
	list_print(mylist1);
}

只有一个元素前面的元素和它一样时,才会删除这个元素。

4、remove

删除list里面与指定的val值相同的元素,有多少个就删除多少个;

void remove_test()
{
	int arr[] = { 1,22,3,88,9,3};
	list<int> mylist(arr, arr + sizeof(arr) / sizeof(arr[0]));
	list_print(mylist);
	mylist.remove(3);
	list_print(mylist);
}

 5、merge

整合一个list(A)进入另一个list(B),这两个list都必须是有序的,整合的数据从左到右升序排列,整合完之后A为kong,B中数据增加,但是这些操作不涉及到数据的创建和销毁,只是转移;

void merge_test()
{
	list<double> first, second;
	first.push_back(2.1);
	first.push_back(6.1);
	first.push_back(4.1);

	second.push_back(3.1);
	second.push_back(1.1);
	second.push_back(5.1);
	list_print(first);//初始序列打印
	list_print(second);
	first.sort();
	second.sort();
	list_print(first);//排序之后打印
	list_print(second);
	first.merge(second);
	list_print(first);//整合之后打印
	list_print(second);
}

 6、vector和list的sort的比较

vector用sort比list用sort更快

void sort_comp()
{
	srand((unsigned)time(NULL));
	list<int> my_list;
	vector<int> my_vector;
	for (int i = 0; i < 1000000; i++)
	{
		int a = rand() % 1000000;
		my_list.push_back(a);
		my_vector.push_back(a);
	}
	clock_t start1 = clock();
	my_list.sort();
	clock_t end1 = clock();
	int rsl1 = (int)(end1 - start1);

	clock_t start2 = clock();
	sort(my_vector.begin(),my_vector.end());
	clock_t end2 = clock();
	int rsl2 = (int)(end2 - start2);
	cout << "list_sort:" << rsl1 << endl;
	cout << "vector_sort::" << rsl2 << endl;
}

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

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

相关文章

【L波段差分干涉SAR卫星(陆地探测一号01组)】

L波段差分干涉SAR卫星&#xff08;陆地探测一号01组&#xff09; L波段差分干涉SAR卫星&#xff08;陆地探测一号01组&#xff09;是我国自主研发的重要卫星系统&#xff0c;以下是对该卫星的详细介绍&#xff1a; 一、基本信息 卫星组成&#xff1a;陆地探测一号01组由A星…

SysML图例-无人机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

AndroidLogger插件使用技巧

它是一个Notepad插件&#xff0c;由于未上架Notepad的插件市场&#xff0c;因此需要独立下载并解压到 Notepad 安装目录下 plugin 里面即可。已更新到 SourceForge&#xff0c;您可以到那里获取最新的包&#xff0c;目前还在持续升级。 https://sourceforge.net/projects/andro…

简单顺序计算器

C语言题目&#xff1a;简单顺序计算器&#xff0c;用python代码解。 (笔记模板由python脚本于2024年09月27日 22:58:16创建&#xff0c;本篇笔记适合喜欢python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖…

使用FFmpeg压缩MP3格式音频

FFmpeg简介 FFmpeg 是一个开源的多媒体框架&#xff0c;能够录制、转换数字音频和视频&#xff0c;并将其转码到流行的格式。它被广泛应用于音视频处理领域&#xff0c;支持几乎所有的音视频格式和编解码器。以下是 FFmpeg 的一些关键特点和功能&#xff1a; 主要特点 跨平台…

Stable Diffusion绘画 | SDXL模型使用注意事项

注意事项 SDXL模型的使用&#xff0c;对电脑配置要求更高&#xff0c;需要 8GB 以上显存的显卡SDXL模型兼容性不太好&#xff0c;容易出现错误&#xff0c;对 Mac 电脑不友好只能选择 SDXL模型 训练的 LoRA 使用不能使用旧的 VAE文件 SDXL 专用 VAE 文件&#xff1a;sdxl_vae.…

CEPH的写入流程

1、客户端程序发起对文件的读写请求&#xff0c;ceph前端接口&#xff08;RADOS Gateway&#xff09;将文件切分成多个固定大小的对象&#xff08;默认大小为4MB&#xff09; 2、计算文件到对象的映射 (1) 计算OID为每个对象分配一个唯一的OID&#xff08;Object ID&#xff09…

构造+bfs,CF 761E - Dasha and Puzzle

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 761E - Dasha and Puzzle 二、解题报告 1、思路分析 如果一个点的度 >…

[数据集][目标检测]辣椒缺陷检测数据集VOC+YOLO格式695张5类别

重要说明&#xff1a;数据集图片里面都是一个辣椒&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求下载 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文…

时间安全精细化管理平台/iapp/mobile/facereg/facereg.html接口存在未授权访问漏洞

漏洞描述 登录--时间&安全精细化管理平台/iapp/mobile/facereg/facereg.html接口存在未授权访问漏洞&#xff0c;黑客可以未授权等级员工信息对平台造成影响 FOFA&#xff1a; body"登录--时间&amp;安全精细化管理平台" 漏洞复现 IP/iapp/mobile/facereg…

SIMETRIX 探头和测量

来源:公众号 xuyuntong 随着工作的调整仿真那是越用越多了,在做仿真的时候我们对结果往往都需要做一些测量,怎么样让我们的测量更加的高效呢? 我们也从做中学,从学中做,仿真主要还是培养对电路的直觉虽说讲的是工具还是从电路做起,在做电路过程中把工具学了。 现在我…

[Python学习日记-30] Python中数据类型与文件操作的补充(Bytes 类型、字符编码的转换、深浅 Copy)

[Python学习日记-30] Python中数据类型与文件操作的补充 Bytes 类型 字符编码的转换 深浅 Copy Bytes 类型 一、定义 Bytes 类型是指一堆字节的集合&#xff0c;在 Python 中以 b 开头的字符串都是 Bytes 类型。从前面学习的字符编码当中知道&#xff0c;数据存到硬盘当中都…

C++ day07

C笔试题合集&#xff1a; 1、什么是虚函数&#xff1f;什么是纯虚函数&#xff1f; 1>在类中定义函数时&#xff0c;在函数名前加上virtual关键字&#xff0c;该函数就是虚函数&#xff0c;虚函数可以保证在父子类中只有一个该函数。 2>当虚函数头 0&#xff1b;时该函…

Killing LeetCode [416] 分割等和子集

Description 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 Intro Ref Link&#xff1a;https://leetcode.cn/problems/partition-equal-subset-sum/description/ Difficulty&#xff1a;Med…

【C++报错已解决】std::ios_base::sync_with_stdio

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

CSS——边框线条动画效果

CSS——边框线条动画效果 上次我们实现了边框的线条缩放效果&#xff0c;今天我们来用三种方式完成边框的线条旋转动态效果。 方法一&#xff1a;使用伪元素 这是最普遍、最常用的方法&#xff0c;我们需要为边框所在的元素添加伪元素&#xff0c;然后旋转这个伪元素即可。本…

OpenMV与STM32通信全面指南

目录 引言 一、OpenMV和STM32简介 1.1 OpenMV简介 1.2 STM32简介 二、通信协议概述 三、硬件连接 3.1 硬件准备 3.2 引脚连接 四、软件环境搭建 4.1 OpenMV IDE安装 4.2 STM32开发环境 五、UART通信实现 5.1 OpenMV端编程 5.2 STM32端编程 六、SPI通信实现 6.1 …

【蓝桥杯省赛真题55】Scratch找不同游戏 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

scratch找不同游戏 第十五届青少年蓝桥杯scratch编程选拔赛真题解析 PS&#xff1a;其实这题在选拔赛里面就出现过类似的题目&#xff0c;只是难度提升了一点&#xff0c;具体可以见【蓝桥杯选拔赛真题84】Scratch找不同游戏 第十五届蓝桥杯scratch图形化编程 少儿编程创意编…

newbie难度——暴力枚举

newbie难度——暴力枚举 740 - 1743A 给出的样例能够理解&#xff0c;如果有n个数字不能选&#xff0c;要排四个数字&#xff0c;这四个数字只有两个不同&#xff0c;并且这两个相同的会各自出现两次&#xff0c;有6种排列方式&#xff0c;那如果给出小于样例n的数字&#xff…

电子电路智能设计课程内容是什么?

电子电路智能设计课程通常包括一系列内容&#xff0c;旨在教授学生如何使用现代电子设计自动化&#xff08;EDA&#xff09;工具和技术来设计和分析电子电路。 1. 电子设计自动化&#xff08;EDA&#xff09;概述&#xff1a; - EDA的历史和发展 - EDA在电子设计中的作用 - …