【C++】迭代器失效

【C++】迭代器失效

迭代器失效

在这里插入图片描述

定义

​ 迭代器失效是指在使用迭代器遍历容器(如vectorlistmap等)的过程中,由于容器内部结构发生了变化,导致原来的迭代器不再有效,不能正确地指向它原本所指向的元素或者不能按照预期的方式进行遍历。

以 vector 为例说明

插入操作导致的迭代器失效

​ 当在vector中插入元素时,如果插入操作导致了内存重新分配,那么所有指向该vector的迭代器都会失效。这是因为vector的存储是连续的内存空间,当插入元素使得当前容量不够时,vector会重新分配一块更大的内存空间,将原来的元素复制或移动到新的空间中,原来的迭代器所指向的内存地址就不再有效

例:

#include<iostream>#include<vector>intmain(){ std::vector<int> v ={1,2,3};auto it = v.begin(); v.push_back(4);// 插入元素可能导致内存重新分配// 此时it可能已经失效,下面的操作可能会导致程序出错 std::cout <<*it << std::endl;return0;}

调整一下:

删除操作导致的迭代器失效

​ 在vector中删除元素后,被删除元素之后的迭代器都会失效。这是因为删除元素会导致后面的元素向前移动,迭代器原本指向的元素位置发生了改变。

如:

#include<iostream>#include<vector>intmain(){ std::vector<int> v ={1,2,3,4};auto it = v.begin()+1;// 指向元素2 v.erase(it);// 删除元素2// 此时it已经失效,下面的操作可能会导致程序出错 std::cout <<*it << std::endl;return0;}

以 list 为例说明

插入操作

​ 对于list容器,插入操作不会导致迭代器失效。因为list是由节点组成的链表结构,插入新节点只是修改节点之间的链接关系,迭代器指向的节点本身并没有改变。

​ 例如:

#include<iostream>#include<list>intmain(){ std::list<int> l ={1,2,3};auto it = l.begin(); l.insert(it,0);// 在头部插入元素0 std::cout <<*it << std::endl;// it仍然有效,输出1return0;}
删除操作

​ 在list中删除一个元素后,只有指向被删除元素的迭代器会失效。其他迭代器不受影响,因为链表结构的特点使得删除操作只是调整节点之间的连接,不会像vector那样引起其他元素的移动。

​ 例如:

#include<iostream>#include<list>intmain(){ std::list<int> l ={1,2,3};auto it = l.begin(); l.erase(it);// 删除第一个元素1// it已经失效,不能再使用// 可以重新获取迭代器来遍历for(auto new_it = l.begin(); new_it!= l.end();++new_it){ std::cout <<*new_it << std::endl;}return0;}

​ 又如:

在关联容器中的情况

​ 对于关联容器(以map为例),插入操作不会导致迭代器失效,因为插入新元素只是在红黑树(map通常的底层实现)中添加一个节点,不会改变已有节点的地址。
​ 删除操作会导致指向被删除元素的迭代器失效,但其他迭代器仍然有效,因为红黑树的结构调整不会影响其他节点的内存位置。
​ 例如:

#include<iostream>#include<map>intmain(){ std::map<int,int> m ={{1,10},{2,20}};auto it = m.find(1); m.erase(it);// 删除键为1的元素// it已经失效,不能再使用for(auto new_it = m.begin(); new_it!= m.end();++new_it){ std::cout << new_it->first <<" "<< new_it->second << std::endl;}return0;}

本文结束。

Read more

人工智能进化全景:从专用工具到超级智能的跃迁(ANI、AIGC、AGI和ASI)

人工智能进化全景:从专用工具到超级智能的跃迁(ANI、AIGC、AGI和ASI)

1. 人工智能的谱系:从ANI到ASI的进化阶梯 在人工智能领域,ANI、AIGC、AGI和ASI代表了智能发展的不同阶段和形态。这些概念构成了理解人工智能发展路径的关键框架。 1.1 ANI:专业化智能的时代 人工狭义智能(Artificial Narrow Intelligence,ANI) 是我们今天生活中无处不在的人工智能形式。这类系统被设计用于在特定、有限范围内执行任务,其特点是高专业性和低泛化能力。 ANI系统已经深入到我们生活的方方面面: * 自然语言处理:如智能客服、语音助手(Siri、Alexa) * 计算机视觉:人脸识别、医学影像分析 * 推荐系统:Netflix的影片推荐、Amazon的购物推荐 * 预测分析:金融风险评估、天气预报模型 一个典型的ANI系统架构通常包括数据收集模块、特定算法模型和结果输出模块。以AlphaGo为例,它能够在围棋领域超越人类顶尖选手,却无法将这种能力转移到简单的图像识别任务中。 1.2 AIGC:创造力的觉醒 人工智能生成内容(Artificial Intelligence Generated Content

By Ne0inhk
AIGC时代——语义化AI驱动器:提示词的未来图景与技术深潜

AIGC时代——语义化AI驱动器:提示词的未来图景与技术深潜

文章目录 * 一、技术范式重构:从指令集到语义认知网络 * 1.1 多模态语义解析器的进化路径 * 1.2 提示词工程的认知分层 * 二、交互革命:从提示词到意图理解 * 2.1 自然语言交互的认知进化 * 2.2 专业领域的认知增强 * 三、未来技术图谱:2025-2030演进路线 * 3.1 2025年关键突破 * 3.2 2027年技术里程碑 * 3.3 2030年技术愿景 * 四、伦理与治理:构建可信语义化AI * 4.1 动态伦理约束框架 * 4.2 提示词审计系统 * 五、开发者能力升级路线图 * 5.1 核心技能矩阵 * 5.2 典型学习路径 * 结语 * 《驱动AI:

By Ne0inhk
在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南

在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南

目录 * 在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南 * 引言:从“为什么选择昇腾”开始 * 第一幕:环境搭建——好的开始是成功的一半 * 1.1 GitCode Notebook 创建“避坑指南” * 1.2 环境验证:“Hello, NPU!” * 第二幕:模型部署——从下载到运行的“荆棘之路” * 2.1 安装依赖与模型下载 * 2.2 核心部署代码与“坑”的化解 * 第三幕:性能测试——揭开昇腾NPU的真实面纱 * 3.1 严谨的性能测试脚本 * 3.2 测试结果与分析 * 第四幕:性能优化——让Llama跑得更快 * 4.1 使用昇腾原生大模型框架 * 4.

By Ne0inhk

Claude Code的完美平替:OpenCode + GitHub Copilot

引言:Claude 虽好,但你真的能用上吗? 在当前席卷全球的“Vibe Coding”浪潮中,Anthropic 推出的 Claude 系列模型 + 终端工具 Claude Code,凭借极强的逻辑推理能力,成为了开发者眼中的“白月光”。但现实是残酷的:对于中国开发者而言,账号随时被封、海外信用卡支付遭拒、API 额度受限以及复杂的网络环境,构成了一道难以逾越的门槛。 虽然最近国产编程模型不断发力,Claude Code + GLM-4.7的表现非常出色,但面对复杂问题,Claude系列模型依然完胜。难道我们只能眼馋Claude全家桶的编程体验吗? 作为一名追求极致生产力的开发者,我发现了一个绝佳的完美替代方案:OpenCode + GitHub Copilot。这个组合不仅能让你享受如 GLM-4.7 一样的性价比,还能更方便的使用 Claude 的顶级模型。 Claude Code 的开源免费平替:OpenCode 想要复刻

By Ne0inhk