List 容器的接口使用、迭代器失效(仅erase)

news2024/11/28 13:55:52

目录

一、接口使用

① 构造函数

②迭代器

③ 容量与元素修改

④ remove

 ⑤remove_if

 ⑥ unique

 ⑦sort()

⑧ merge()

 二、对于迭代器失效问题


 

一、接口使用

 

① 构造函数

void MyListTest1()
{
	list<int> l1;
	list<int> l5(10, 5);

	vector<int> v = { 4,5,7,8,2 };
	list<int> l3(v.begin(), v.end());

	list<int> l4(l3);

	// c++11中
	list<int> l2 = { 0,1,2,3,4,5 };
}

②迭代器

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

void MyListTest2()
{
	vector<int> v = { 4,5,7,8,2 };
	list<int> l(v.begin(), v.end());
	auto it = l.begin();
	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	auto rit = l.rbegin();
	while (rit != l.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
}

③ 容量与元素修改

void PrintList(const list<int>& l)
{
	auto it = l.begin();
	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

void MyListTest3()
{
	vector<int> v = { 4,5,7,8,2 };
	list<int> l(v.begin(), v.end());
	cout << l.back() << " " << l.front() << " " << endl;
	cout << l.size() << endl;
}

void MyListTest4()
{
	vector<int> v = { 4,5,7,8,2 };
	list<int> l(v.begin(), v.end());
	l.push_back(9);
	l.push_front(20);
	l.push_front(20);
	l.push_front(20);
	l.push_front(20);
	cout << l.size() << endl;
	l.pop_back();
	l.pop_front();
	cout << l.back() << " " << l.front() << " " << endl;
	cout << l.size() << endl;
}

void MyListTest5()
{
	vector<int> v = { 4,5,7,8,2 };
	list<int> l(v.begin(), v.end());
	auto it = l.begin();
	l.insert(it, 10, 2);
	l.insert(l.end(), 10);
}

void MyListTest6()
{
	list<int> l = { 0,1,2,3,4,5,6,7,8 };
	auto pos = find(l.begin(), l.end(), 5);
	l.insert(pos, 5, 1);
	PrintList(l);
}

void MyListTest7()
{
	list<int> l = { 0,1,2,3,4,5,6,7,8 };
	auto pos = find(l.begin(), l.end(), 5);
	// pos = l.erase(pos);
	l.erase(pos++);
	cout << *pos << endl;

    l.erase(l.begin(), l.end());
	if (l.empty())
		cout << "is empty" << endl;
	else
		cout << "is not empty" << endl;
}

④ remove

要删除的元素的值。

成员类型value_type是容器中元素的类型,在列表中定义为其第一个模板参数(T)的别名。

删除具有特定值的元素

从容器中删除与值相等的所有元素。这将调用这些对象的析构函数,并按删除的元素数减少容器大小。
与成员函数list::erase(使用迭代器)按位置删除元素不同,此函数(list::remove)按值删除元素。
存在一个类似的函数list::remove_if,它允许使用除相等比较以外的条件来确定是否删除元素。

 ⑤remove_if

从容器中删除Predicate pred返回true的所有元素。这将调用这些对象的析构函数,并根据移除的元素数量减少容器大小。


该函数为每个元素调用pred(*i)(其中i是该元素的迭代器)。列表中返回true的任何元素都将从容器中删除。

 ⑥ unique

没有参数(1)的版本将从容器中的每个连续相等元素组中删除除第一个元素之外的所有元素。


请注意,只有当元素与前面的元素相比较时,元素才会从列表容器中删除。因此,此函数对于排序列表特别有用。


第二个版本(2)将确定元素“唯一性”的特定比较函数作为参数。事实上,任何行为都可以实现(不仅是相等比较),但请注意,函数将为所有元素对调用binary_pred(*i,*(i-1))(其中i是元素的迭代器,从第二个元素开始),如果谓词返回true,则从列表中删除i。


移除的元素将被销毁。

对于有序列表就是去重保留第一个,对于下方无序元素,保留第一个,连续相等元素组中删除除第一个元素之外的所有元素。

 ⑦sort()

对列表中的元素进行排序,更改它们在容器中的位置。
通过应用使用运算符<(版本(1)中)或comp(版本(2)中)比较元素的算法来执行排序。这种比较应产生元素的严格弱排序(即,一致的传递性比较,而不考虑其自反性)。
生成的等价元素的顺序是稳定的:即,等价元素保持调用之前的相对顺序。
整个操作不涉及任何元素对象的构造、销毁或复制。元素在容器内移动。

(1)
  void sort();
(2)
template <class Compare>  void sort (Compare comp);

 默认为由小到大排序

 通过调用Compare改变排序的方向

⑧ merge()

通过将x的所有元素在其各自的订购位置转移到容器中(两个容器都已订购),将x合并到列表中。
这有效地删除了x中的所有元素(变为空),并将它们插入到容器中的有序位置(其大小根据传输的元素数量而扩展)。执行该操作时,不会构造或破坏任何元素:无论x是左值还是右值,或者value_type是否支持移动构造,都会传递这些元素。
具有两个参数(2)的模板版本具有相同的行为,但采用特定谓词(comp)来执行元素之间的比较操作。这种比较应产生元素的严格弱排序(即,一致的传递性比较,而不考虑其自反性)。
此函数要求列表容器的元素在调用之前已经按值(或comp)排序。有关无序列表的替代方案,请参见列表::splice。
假设这样的排序,根据运算符<或comp定义的严格弱排序,x的每个元素都插入到与其值对应的位置。生成的等价元素的顺序是稳定的(即,等价元素保持它们在调用之前的相对顺序,现有元素先于从x插入的等价元素)。
如果(&x==this),则函数不执行任何操作。

注意  merge接口的使用, 俩个对象在使用merge之前必须保证为有序序列

 ⑨ reverse()

 反转链表

 二、对于迭代器失效问题

迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。

因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代
器失效的。
在pos位置插入元素之后,pos位置之后元素的迭代器

只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

解决:用pos来接受

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

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

相关文章

〖产品思维训练白宝书 - 产品思维认知篇⑦〗- 聊一聊 产品经理 的工作内容与职责划分

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

自定义类型【c语言】

前言&#xff1a; c语言提供了丰富的内置类型&#xff0c;但是在描述一些复杂对象的时候仍不能满足一定的功能&#xff0c;因此c语言为了支持我们能描述一些复杂对象给出了我们能自定义的一些类型&#xff0c;因此便有了自定义类型。 在之前我们已经初步对结构体进行相应的了解…

提升工作效率,领导都夸的开源数据可视化工具

echarts官网有很多好看的图例&#xff0c;怎么结合起来放到自己的项目中呢&#xff1f;比如这种酷酷的首页&#xff1a; 这种看起来美观又大方&#xff0c;自己要是能用上就好了。 其实这是可以的&#xff0c;echarts上有现成的图例和示例代码&#xff0c;咱们只要改改数据源就…

华为防火接与二层交换机对接配置VLAN上网设置

拓扑图 一、防火墙设置 1、G1/0/0接口设置IP&#xff0c;G1/0/1接口切换二层口设置VLAN&#xff0c;G1/0/0 桥接了本地无线网卡来模拟外网地址 <USG6000V1>sys [USG6000V1]sys FW1 [FW1]un in en# 设置外网IP [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip addr 192.1…

ORB-SLAM2 --- LocalMapping::SearchInNeighbors函数

0.函数更新内容 仅对地图点进行融合。 1.函数作用 检查并融合当前关键帧与相邻帧&#xff08;两级相邻&#xff09;重复的地图点。 2.函数步骤 Step 1&#xff1a;获得当前关键帧在共视图中权重排名前nn的邻接关键帧 Step 2&#xff1a;存储一级相邻关键帧及其二级相邻关键帧 将…

Java变量的作用域:静态变量、全局变量和局部变量

变量的作用域规定了变量所能使用的范围&#xff0c;只有在作用域范围内变量才能被使用。根据变量声明地点的不同&#xff0c;变量的作用域也不同。根据作用域的不同&#xff0c;一般将变量分为不同的类型&#xff1a;成员变量和局部变量。下面对这几种变量进行详细说明。成员变…

代码随想录训练营第四十二天

1.背包问题 1.1 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 1.1.1 用动态规划的方法解决------二维dp数组01背包 ①确定dp…

学一下这个60秒的男人

程序员求职简历&#xff0c;项目经验怎么写&#xff1f;免费修改简历、提供模板并内部推荐今天想跟大家聊一下这个“60秒”的男人。10月21日&#xff0c;罗辑思维发文&#xff1a;《罗胖60秒&#xff1a;10年期满&#xff0c;今日告别》。10年前&#xff0c;罗振宇开始干一件事…

智能防雷,智能防雷系统的应用研究方案

“智慧智能防雷”是近年来防雷界提出的一个全新的防雷理念&#xff0c;是防雷业发展的趋势。所谓“智慧智能防雷”&#xff0c;是将大数据分析、云存储、人工智能、移动互联网和物联网技术融入到传统防雷措施中&#xff0c;并通过软、硬件系统的集成&#xff0c;实现对特定的区…

企业微信收款后可以进行退款吗?如何操作?

很多企业使用企业微信运营&#xff0c;就是看中了企业微信对外收款的功能&#xff0c;它不仅简化了转账步骤&#xff0c;而且可以在必要时直接完成退款&#xff0c;操作简单方便。前言随着企业微信的普及度&#xff0c;越来越多的企业认识到企业微信运营功能的强大&#xff0c;…

带你了解2023新版本Internet Download Manager有哪些新功能优势

作为一款体积只有10M的下载软件&#xff0c;IDM却常年霸占着各软件评测榜的前列。它的界面简洁清爽&#xff0c;使用过程中无弹窗、无广告&#xff0c;小小的体积竟能将下载速度提升5倍&#xff01;该软件一进入中国市场&#xff0c;便受到了广大用户的追捧&#xff0c;被大家亲…

2023年留学基金委(CSC)联合培养博士研究生项目解读及建议

近日&#xff0c;国家留学基金委&#xff08;CSC&#xff09;公布了2023年国家建设高水平大学公派研究生项目&#xff0c;该项目分为两部分&#xff0c;1.申请攻读博士学位研究生&#xff1b;2.申请联合培养博士研究生。本文知识人网小编仅就联合培养博士研究生部分进行解读&am…

【生信】R语言进行id转换的方法(附可直接使用代码)

本文我都默认已经下载好了表达矩阵exp了哦 代码都是直接给出来了&#xff0c;需要修改的地方我进行了标记 一般只要修改一下都能直接用了 方法一&#xff1a;下载平台数据以得到对应信息 然后进入官网https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi&#xff0c;在这里我以G…

【数据结构】4.4 数组

4.4.1 数组的定义 数组&#xff1a; 按照一定格式排列起来的&#xff0c;具有相同类型的数据元素的集合。 一维数组&#xff1a; 若线性表中的数据元素为非结构的简单元素&#xff0c;则称为一维数组。逻辑结构&#xff1a;线性结构&#xff0c;固定长度的线性表。声明格式…

如何学习微服务架构?(项目学习)

哪些项目适合使用微服务架构&#xff1f;对于一般的公司来说&#xff0c;微服务的实践有着很大的技术挑战&#xff0c;所以并不是所有的公司都适合将整体架构拆分成微服务架构。一般来说&#xff0c;微服务架构更适合于未来具有一定扩展复杂度、具有大量增量用户期望的应用&…

最新综述:基于语言模型提示学习的推理

©PaperWeekly 原创 作者 | OE-Heart引言推理能力是人类智能的核心能力之一。随着预训练技术的不断发展&#xff0c;大模型辅之以提示学习&#xff08;如 Chain-of-Thought Prompting [1]&#xff09;涌现出一系列的惊人的推理能力&#xff0c;引起了学术界、工业界学者的…

动态规划——数位dp

数位dp 文章目录数位dp概述题目特征基本原理计数技巧模板例题度的数量思路代码数字游戏思路代码不要62思路代码概述 数位是指把一个数字按照个、十、百、千等等一位一位地拆开&#xff0c;关注它每一位上的数字。如果拆的是十进制数&#xff0c;那么每一位数字都是 0~9&#xf…

unity 前向渲染 渲染阴影原理

下面情况默认是 前向渲染路径&#xff0c;场景中平行光开启了阴影方式原理备注ShadowMap把相机放到光源的位置&#xff0c;那么场景中该光源的阴影区域就是那些相机看不到的位置得到的是&#xff1a;场景中距离光源最近的表面位置&#xff08;深度信息&#xff09;unity中专门的…

一个基于SpringBoot+vue的学生信息管理系统详细设计

一个基于SpringBootvue的学生信息管理系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

【docker08】本地镜像发布到阿里云

本地镜像发布到阿里云流程 1.流程 2.镜像的生成方法 基于当前容器创建一个新的镜像&#xff0c;新功能增强命令&#xff1a; docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]] 3.将本地镜像推送到阿里云 3.1本地镜像素材原型 3.2阿里云开发者平台 进入阿里云找到控制台进…