c++中List在遍历时删除节点的方法,带源码

C/C++ List实现算法详解及源码 List实现算法是一种数据结构,用于存储一系列元素,并提供操作这些元素的方法。List通常是一种动态数组的实现方式,它可以自动调整大小以适应元素的添加和删除。List实现算法是一种数据结构,用于存储一系列元素,并提供操作这些元素的方法。List通常是一种动态数组的实现方式,它可以自动调整大小以适应元素的添加和删除。List实现算法是一种数据结构,用于存储一系列元素,并提供操作这些元素的方法。List实现算法是一种数据结构,用于存储一系列元素,并提供操作这些元素的方法。 阅读详情

今天在开发的过程中遇到问题,想要遍历一个List中的节点,满足一定条件则删除该节点,但是由于使用的是iterator就会出现错误,最后找到解决方法,并写了一个测试程序,呵呵:



// ListTest.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;


struct st_user
{
	int id;
	char name[255];
};

int _tmain(int argc, _TCHAR* argv[])
{

	st_user a1,a2,a3;

	a1.id = 1;
	sprintf(a1.name,"%s","xxxxxxxxx");
	a2.id = 2;
	sprintf(a2.name,"%s","fff");
	a3.id = 3;
	sprintf(a3.name,"%s","bbbb");

	list<st_user*> list1;

	list1.push_back(&a1);
	list1.push_back(&a2);
	list1.push_back(&a3);


	printf("------------------------------\n");


	for(list<st_user*>::iterator iter = list1.begin(); iter != list1.end(); ++iter)
	{
		printf("%s \n", (*iter)->name);
	}


	printf("------------------------------\n");


	for(list<st_user*>::iterator iter = list1.begin(); iter != list1.end();)
	{
		if( (*t)->id == 2 )
		{
			iter = list1.erase(t);
		}
		else
			++iter;

	}

	printf("------------------------------\n");


	for(list<st_user*>::iterator iter = list1.begin(); iter != list1.end(); ++iter)
	{
		printf("%s \n", (*iter)->name);
	}


	printf("------------------------------\n");


	system("pause");


	return 0;
}



运行结果:



--------------------------------------

@2015-7-20 10:06:01 修正了网友们提到的错误,哈哈,这个错误太低级了,敬请原谅

原来错误的代码:

	for(list<st_user*>::iterator iter = list1.begin(); iter != list1.end(); ++iter)
	{
		if( (*t)->id == 2 )
		{
			list1.erase(t);
		}
	}




C/C++ 循环链表circular linked list算法详解及源码 循环链表(Circular Linked List)是一种链表数据结构,其中最后一个节点的指针指向第一个节点,形成一个循环。与普通链表相比,循环链表在遍历时不会出现空指针情况。 阅读详情

相关推荐

C/C++ double linked list双向链表算法详解及源码

双向链表(Double Linked List)是一种常见的链表数据结构,相比单向链表,它的每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。这样的结构使得双向链表可以在任意位置进行插入和删除操作。下面对双向链表算法进行详细解释,并介绍其优缺点。双向链表算法在实际应用中具有很大的灵活性,可以用于实现堆栈、队列等数据结构,或作为缓存、缓冲区等场景中的高效数据存储方式。双向链表算法的主要操作有插入、删除和遍历。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 7584

c++ list 遍历删除节点

c++ list 遍历中删除节点#include<iostream> #include<list> using namespace std;int main() { int a[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 10}; list<int> li(a, a + 12); //遍历删除值为5的节点 for (list<in

叶浩浩的博客 6927

C++ STL list 遍历删除出错解决方案

主要介绍了C++ STL list 遍历删除出错解决方案的相关资料,这里对出错进行分析,并给出正确的解决方法,需要的朋友可以参考下

C++遍历list删除当前元素

C++ 遍历list

qq_31231915的博客 2227

Abaqus SIGTERM/SIGINT中断问题深度解析与实战解决方案

本文深度解析Abaqus仿真计算中因SIGTERM或SIGINT信号导致作业意外终止的常见问题。核心原因常为许可证管理器因网络通信延迟误判进程空闲而强制断开,或系统资源监控工具的误杀。文章提供了从命令行参数调优(如使用int、ask_delete=OFF)、计算环境隔离到编写自动化容错脚本的完整实战解决方案,帮助用户彻底规避此类中断,确保长时间仿真任务的稳定运行。

weixin_29279101的博客 413

Unity物理驱动3D汽车实现:从刚体控制到参数调优

在游戏开发中,刚体物理是实现真实物体运动与交互的核心技术。通过Unity的物理引擎,开发者可以模拟重力、碰撞、摩擦力等物理行为,为游戏世界注入真实感。其技术价值在于能够以符合物理规律的方式驱动游戏对象,避免穿墙、无视惯性等问题,从而提升游戏体验的真实性和沉浸感。这一原理广泛应用于角色控制、车辆模拟、物体破坏等场景。本文以3D小汽车为例,详细解析了如何通过Rigidbody组件施加力与扭矩,并利用C#脚本实现玩家输入逻辑,完成一辆可操控、能碰撞的物理驱动汽车。文中重点探讨了AddForce与角速度控制两种方案

weixin_34380948的博客 501

c++下list在遍历时删除节点的方法

c++中,list是个链表,当遍历中删除当前节点,在下一次循环时,对已删除iterator节点进行递加操作,将导致错误。那么,我们可以在删除先,先保存要删除的节点,然后再移动,再删除,就不会出现问题了。以下是示意代码。 #include using namespace std; int  main(int argc, char* argv[]) {

tzz8080的专栏 3226

通义万相Wan2.1模型Lora训练以及推理

使用DiffSynth-Studio进行通义万象Wan2.1的Lora训练和推理

qq_64858624的博客 4604

std::remove_if

原型: #include <algorithm>forward_iterator remove_if(forward_iterator start,forward_iterator end,Predicate p); 函数remove_if()移除序列[start, end)中所有应用于谓词p返回true的元素. 此函数返回一个指向被修剪的序列的最后一个元素迭代器. ...

weixin_30532987的博客 322

使用 Vosk 实现语音识别

在近两年里,如果说想要在本地部署离线语音识别模型,那么和肯定是首选项。所以为什么要使用呢?

weixin_48967543的博客 9719

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

浪子L的博客 5223

C++遍历删除元素

C++遍历删除元素 转自:http://zencoder.info/2019/10/11/erase-element-from-container/ 今天看到一个patch fix从std::map中遍历删除元素导致crash问题,突然意识到自己对如何正确地从map等C++容器中删除元素也没有很牢固清醒的认知。重新梳理了下这块的正确做法,记录在此,以备后忘。 基础知识 C++的容器按存储方式分为两类: 以数组形式存储的顺序容器,如:vector,deque 以不连续节点形式存储的容易,如:list, se

weixin_44966641的博客 4312

Jetson Orin Nano 平台适配IMX585 camera驱动调试记录

Jetson Orin Nano Devkit适配imx585 camera使用argus_camera捕获流,图片是黑色的用示波器来测量mipi信号,信号正常Jetpack版本: sensor参数: dts配置: 分析log: 如图: EBD有两行修改dts: 测试如下:log: 需要注意极性互换查看相应的原理图设置。可以使用设备树属性lane_polarity在任何lane上配置极性交换。例如, 尝试调整极性出现花屏 根据上述像素时钟配置说明调整为如下配置后,出图正常

jzwjzw19900922的博客 1322

List遍历时删除元素中存在的问题

下面列举常见的三中遍历list是删除元素的方法。 ​ public class ListTest5 { public static void main(String[] args) { ArrayList&lt;String&gt; list = new ArrayList&lt;&gt;(); list.add("java"); list.add("c#"); li...

Daniel的博客 3450

通过采用下面方法检查内容,还是系统无法更新下载,但是错误代码变成了——下载错误 - 0x80004002-到底如何解决?必须重装系统吗?-这个到底是系统问题,还是硬件问题?

‌。

qq_15963745的博客 335

OpenClaw实战系列01:OpenClaw接入飞书机器人全接入指南 + Ollama本地大模型

通过 OpenClaw + Ollama + 飞书的组合,我们成功搭建了一个完全私有、免费、可定制的AI助理。它不仅能在日常聊天中提供帮助,还能通过OpenClaw强大的“技能”体系,真正去操作你的电脑、管理文件、甚至执行代码。这套方案将数据留在本地,既保证了隐私安全,又锻炼了动手能力。现在,去给你的AI助理添加更多酷炫的技能吧!

PeterPan的博客 1万+

vector, list, map在遍历时删除符合条件的元素

直接看源码,内有详细解释

JoeBlackZQQ的专栏 3001

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STL源码解析之list(1)

T data;STL list是一个双向链表,next指向下一个节点,prev指向前一个节点。

taxue4485的专栏 332

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

关于list iterator not incrementable的解决方法

关于list iterator not incrementable的解决方法1.错误源码2.错误分析3.修正 编译环境:VS2015 语言:C++ 参考博客:https://blog.youkuaiyun.com/qingtianweichong/article/details/9531919 话休絮烦,直接贴上报错图片: 看到list字样,应该是list容器部分出现了问题。下面贴出使用list容器的代码块: 1.错误源码 双向链表list及迭代器声明部分: list<Bullet*> m_bullet

Alan_Walker_One的博客 1256

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

List中的元素的删除

list集合中的remove(Object o)方法 在使用迭代器遍历时不能使用 集合对象的remove()方法,会发生读写异常,应该使用迭代器中的remove()方法(//ConcurrentModificationException(并发修改异常)) Iterator iterator = list.iterator(); while (iterator.hasNext(...

Nemo521echo的博客 227

【C++】深挖STL list底层:解迭代器与节点存储逻辑

本文系统讲解 std::list 的核心特性与使用技巧。涵盖:list 的底层结构(双向循环链表 + 哨兵位头节点)、构造与遍历方法、迭代器特性(双向迭代器 vs 随机迭代器)、增删操作(push_front、push_back、insert、erase)、以及 list 专用算法(sort、unique、reverse、merge)。重点分析 list 迭代器不能使用 +/- 的原因,以及 erase 后迭代器失效的正确处理方式。

2502_91546643的博客 440

List中remove()方法的陷阱,被坑惨了

千千万万要记得:多刷题!!多刷题!!之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!篇幅有限,以下只能截图分享部分的资源!!(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)(2)刷的算法题(还有左神的算法笔记)(3)面经+真题解析+对应的相关笔记(很全面)(4)视频学习(部分)ps:当你觉得学不进或者累了的时候,视频是个不错的选择在这里,最后只一句话:祝大家offer拿到手软!!

2401_84411097的博客 1191

C++ std::list splice操作迭代器失效详解与避坑指南

在C++ STL容器中,迭代器失效是开发者常遇到的棘手问题,它源于容器内部结构变化导致指向元素的迭代器、指针或引用变得无效。理解其原理对于编写健壮代码至关重要,尤其在涉及数据搬运和结构修改时。以链表结构为例,其节点指针的重新链接虽不涉及内存释放,但会改变元素的逻辑归属,这正是迭代器逻辑失效的典型场景。这种机制在追求高性能的数据处理中具有重要技术价值,例如在实现对象池、LRU缓存或实时任务调度等需要高效元素移动的场景。本文聚焦于std::list的splice操作,深入剖析其独特的迭代器失效规则。与vecto

weixin_33795806的博客 371

浅谈为什么倒序遍历List删除元素没有问题

要搞清楚这个问题,首先要知道如何正确的遍历List删除元素。注:下述代码完整版附在末尾。 先给出这次测试的list初始化结构: list.add("a"); list.add("b"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); 目的是把其中的两个b元素给删除。...

ls0111的博客 6708

正向遍历删除元素STL

http://www.cppblog.com/kesalin/archive/2014/04/22/cpp_stl.html 众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。本文完整源码:点此查看 首先,要明白使用正向迭代器(iterator)进

hadoop_W的博客 626

C++ : 手写简化版 list 完整实现与高频面试题

本文实现了一个简化版的双向链表容器 MyList,采用双向循环链表结构并包含哨兵节点。核心实现包括: 基础架构 使用 ListNode 结构体存储节点数据、前驱和后继指针 引入哨兵节点实现循环链表边界处理 维护 _size 变量实现 O(1) 复杂度的大小查询 关键功能 双向迭代器支持前向/后向遍历 实现了 insert/erase 核心操作,支持任意位置插入删除 提供 push_back/push_front 和 pop_back/pop_front 双端操作 实现零拷贝的 splice 链表拼接操作 特

Mr.Sugarcane 438
上一篇: vs2010创建Dll例子,并解决运行错误:应用程序正常初始化(0xc000000d)失败。请单击“确定”,终止应用程序。
下一篇: 记录一个unsigned int 的0被-1之后变成大数的小问题
sonikk
博客等级 码龄15年 68粉丝 113原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值