C++ 迭代器失效詳解:如何避免 vector 操作中的陷阱

目錄

1. 什么是迭代器失效?

2. 哪些操作會導致迭代器失效?

2.1?vector?的插入操作(push_back,?insert)

示例:push_back?導致迭代器失效

如何避免?

2.2?vector?的刪除操作(erase,?pop_back)

示例:erase?導致迭代器失效

如何正確刪除?

3. 其他容器的迭代器失效情況

4. 總結


1. 什么是迭代器失效?

在 C++ 中,迭代器(iterator) 是一種類似指針的對象,用于遍歷 STL 容器(如 vectorlistmap 等)。
迭代器失效 是指在對容器進行某些操作(如插入、刪除)后,原本有效的迭代器變得不可用,繼續使用它會導致 未定義行為(Undefined Behavior, UB),如程序崩潰、數據錯誤等

2. 哪些操作會導致迭代器失效?

不同的容器有不同的迭代器失效規則,本文主要討論 vector 的迭代器失效問題。

2.1?vector?的插入操作(push_back,?insert

當向 vector 插入元素時:

  • 如果?size() == capacity()(容量已滿)
    • vector?會重新分配更大的內存,并拷貝原有數據。
    • 所有迭代器失效(包括?begin(),?end()?等)。
  • 如果?size() < capacity()(容量未滿)
    • 插入點之前的迭代器仍然有效
    • 插入點及之后的迭代器失效(因為元素可能被移動)。
示例:push_back?導致迭代器失效
vector<int> v = {1, 2, 3};
auto it = v.begin(); // it 指向 1
v.push_back(4);      // 可能觸發重新分配內存
cout << *it;         // ? 危險!it 可能失效
如何避免?
  • 提前預留空間reserve()):
vector<int> v;
v.reserve(100);    // 預留 100 個元素的空間
auto it = v.begin();
v.push_back(1);    // 不會重新分配,it 仍然有效
  • 使用索引代替迭代器(如果允許)。

2.2?vector?的刪除操作(erase,?pop_back

當從 vector 刪除元素時:

  • 被刪除元素的迭代器失效
  • 被刪除元素之后的所有迭代器失效(因為后面的元素會向前移動)。
  • 刪除點之前的迭代器仍然有效
示例:erase?導致迭代器失效
vector<int> v = {1, 2, 3, 4};
auto it = v.begin() + 2; // it 指向 3
v.erase(v.begin() + 1);  // 刪除 2
cout << *it;             // ? 危險!it 已經失效(3 已經前移)
如何正確刪除?
  • 使用?erase?的返回值(返回下一個有效迭代器):
vector<int> v = {1, 2, 3, 4};
auto it = v.begin();
while (it != v.end()) {if (*it % 2 == 0) {it = v.erase(it); // 刪除并更新 it} else {it++;             // 否則正常遞增}
}

反向遍歷(避免迭代器失效)

for (auto it = v.rbegin(); it != v.rend(); ) {if (*it % 2 == 0) {it = vector<int>::reverse_iterator(v.erase(it.base() - 1));} else {it++;}
}

3. 其他容器的迭代器失效情況

容器插入操作(insert刪除操作(erase
vector可能失效(取決于容量)被刪除及后面的失效
deque可能失效(首尾安全)被刪除及附近的失效
list不會失效僅被刪除的失效
map/set不會失效僅被刪除的失效

4. 總結

  • vector?插入時
    • 可能失效(如果觸發重新分配)。
    • 避免方法:提前?reserve()?或使用索引。
  • vector?刪除時
    • 被刪除及后面的迭代器失效
    • 正確做法:使用?erase?返回值或反向遍歷。
  • 其他容器(如?listmap)通常更安全,但仍需謹慎。

最佳實踐

  1. 避免在遍歷時直接修改容器,除非明確知道迭代器是否有效。
  2. 盡量使用?range-based for?或算法(如?remove_if,減少手動管理迭代器。
  3. 調試時使用?-D_GLIBCXX_DEBUG(GCC)檢測迭代器錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77220.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(EtherCAT 轉 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP協議互轉工業串口網關

型號 協議轉換通信網關 EtherCAT 轉 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 協議轉換網關&#xff0c;為用戶提供兩種不同通訊協議的 PLC 進行數據交互的解決方案&#xff0c;可以輕松容易將 EtherNet/IP 網絡接入 EtherCAT 網絡中&#xff0c;方便…

榕壹云酒水定制系統:基于THinKPHP+MySQL+UniApp打造數字化時代的個性化購酒新體驗

數字化浪潮下的酒水定制新機遇 在消費升級與個性化需求崛起的背景下&#xff0c;傳統酒水行業正面臨數字化轉型的迫切需求。為此&#xff0c;我們團隊基于ThinkPHPMySQLUniApp技術棧&#xff0c;開發了一套榕壹云酒水定制系統&#xff0c;旨在通過數字化手段解決消費者個性化購…

GR00T N1:面向通用類人機器人的開放基礎模型

摘要 通用型機器人需要具備多功能的身體和智能的大腦。近年來&#xff0c;類人機器人的發展在構建人類世界中的通用自主性硬件平臺方面展現出巨大潛力。一個經過大量多樣化數據源訓練的機器人基礎模型&#xff0c;對于使機器人能夠推理新情況、穩健處理現實世界的多變性以及快…

WebRTC實時通話EasyRTC嵌入式音視頻通信SDK,構建智慧醫療遠程會診高效方案

一、方案背景 當前醫療領域&#xff0c;醫療資源分布不均問題尤為突出&#xff0c;大城市和發達地區優質醫療資源集中&#xff0c;偏遠地區醫療設施陳舊、人才稀缺&#xff0c;患者難以獲得高質量的醫療服務&#xff0c;制約醫療事業均衡發展。 EasyRTC技術基于WebRTC等先進技…

深入理解主成分分析(PCA):原理、算法與應用

內容摘要 本文深入剖析主成分分析&#xff08;PCA&#xff09;技術。介紹其通過正交變換簡化數據維度的核心原理&#xff0c;詳細推導基于最小投影距離和最大投影方差的算法過程&#xff0c;總結算法流程步驟。全面分析PCA的優缺點&#xff0c;并對比其與KPCA的差異。同時闡述…

uniapp-商城-25-頂部模塊高度計算

計算高度&#xff1a; 使用computed進行頂部模塊的計算。 總高度&#xff1a;bartotalHeight log 介紹--收款碼這一條目 也就是上一章節的title的高度計算 bodybarheight。 在該組件中&#xff1a; js部分的代碼&#xff1a; 包含了導出的名字&#xff1a; shop-head…

【MCP】第一篇:MCP協議深度解析——大模型時代的“神經連接層“架構揭秘

【MCP】第一篇&#xff1a;MCP協議深度解析——大模型時代的"神經連接層"架構揭秘 一、什么是MCP&#xff1f;二、為什么需要MCP&#xff1f;三、MCP的架構四、MCP與AI交互的原理4.1 ReAct&#xff08;Reasoning Acting&#xff09;模式4.2 Function Calling 模式 五…

李飛飛團隊新作WorldScore:“世界生成”能力迎來統一評測,3D/4D/視頻模型同臺PK

從古老神話中對世界起源的幻想&#xff0c;到如今科學家們在實驗室里對虛擬世界的構建&#xff0c;人類探索世界生成奧秘的腳步從未停歇。如今&#xff0c;隨著人工智能和計算機圖形學的深度融合&#xff0c;我們已站在一個全新的起點&#xff0c;能夠以前所未有的精度和效率去…

[react]Next.js之自適應布局和高清屏幕適配解決方案

序言 閱讀前首先了解即將要用到的兩個包的作用 1.postcss-pxtorem 自動將 CSS 中的 px 單位轉換為 rem 單位按照設計稿尺寸直接寫 px 值&#xff0c;由插件自動計算 rem 值 2.amfe-flexible 動態設置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根據設備屏幕寬度和…

C# 如何比較兩個List是否相等?

簡介 在 C# 里&#xff0c;比較兩個 List 是否相等&#xff0c;需要考慮多個方面&#xff0c;例如列表中的元素順序、元素本身是否相等。下面介紹幾種常見的比較方法&#xff1a; 基本類型比較&#xff08;元素順序必須一致&#xff09; var list1 new List<int> { 1…

【技術派后端篇】Redis分布式鎖:原理、實踐與應用

在當今的高并發系統中&#xff0c;分布式鎖是保障數據一致性和系統穩定性的重要手段。今天&#xff0c;我們就來深入探討一下Redis分布式鎖&#xff0c;揭開它神秘的面紗。 1 本地鎖與分布式鎖的區別 在Java開發的早期階段&#xff0c;我們接觸過synchronized和Lock鎖&#x…

奧比中光tof相機開發學習筆記

針對奧比中光 tof相機&#xff0c;官方提供的資料如下ProcessOn Mindmap|思維導圖 Orbbec SDK Python Wrapper基于Orbbec SDK進行設計封裝&#xff0c;主要實現數據流接收&#xff0c;設備指令控制。下面就其開發適配進行如下總結&#xff1a; &#xff08;1&#xff09;系統配…

如何學習嵌入式

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.04.16 請各位前輩能否給我提點建議&#xff0c;或者學習路線指導一下 STM32單片機學習總…

2025 年藍橋杯 Java B 組真題解析分享

今年是我第二次參加藍橋杯軟件類Java B組的比賽&#xff0c;雖然賽前做了不少準備&#xff0c;但真正坐在考場上時&#xff0c;還是有種熟悉又緊張的感覺。藍橋杯的題目一向以“基礎創新”著稱&#xff0c;今年也不例外&#xff0c;每道題都考驗著我們對算法的理解、代碼實現能…

Vue3服務器端渲染深度實踐:架構、性能與全棧集成

一、SSR架構設計模式 1.1 架構模式選擇矩陣 維度CSRSSR混合渲染首次內容渲染(FCP)慢(依賴JS執行)快(HTML直出)按路由動態選擇SEO支持需預渲染原生支持關鍵頁預渲染服務端壓力低(靜態托管)高(實時渲染)使用緩存中間層TTI(可交互時間)受限于JS體積需等待Hydration漸進式激活適用…

2025年泰迪杯數據挖掘競賽B題論文首發+問題一二三四代碼分享

料 基于穿戴裝備的身體活動監測 摘要 隨著科技的進步&#xff0c;加速度計&#xff0c;能夠實時、準確地捕捉人體的動態變化&#xff0c;成為醫學應用中的一個重要工具。本文將基于題目收集數據進行相關研究。 針對題目給出的數據集&#xff0c;我們首先進行數據清洗工作。首…

國內AI搜索平臺與ChatGPT橫向對比分析

一、核心技術差異 1、?百度文小言? 基于文心大模型4.0升級&#xff0c;主打“新搜索”能力&#xff0c;支持多模態輸入&#xff08;語音、圖片、視頻&#xff09;和富媒體搜索結果?。 獨有的“記憶個性化”功能可結合用戶歷史行為優化回答&#xff0c;并在醫療、教育等垂直…

安卓環境搭建開發工具下載Gradle下載

1.安裝jdk(使用java語言開發安卓app) 核心庫 java.lang java.util java.sq; java.io 2.安裝開發工具(IDE)android studio https://r3---sn-2x3elnel.gvt1-cn.com/edgedl/android/studio/install/2023.3.1.18/android-studio-2023.3.1.18-windows.exe下載完成后一步一步安裝即…

Python 趣味學習 -數據類型脫口秀速記公式 [特殊字符]

&#x1f3a4; Python數據類型脫口秀速記公式 &#x1f40d; 1?? 四大金剛登場 "Set叔(無序潔癖)、Tuple爺(頑固老頭)、List姐(百變女王)、Dict哥(萬能鑰匙)"2?? 特性對比RAP &#x1f3b6; 內存/作用域&#xff1a; 全局變量 → 函數內修改 → 可變(mutable)會…

單片機 | 基于51單片機的傾角測量系統設計

以下是一個基于51單片機的傾角測量系統設計詳解,包含原理、公式和完整代碼: 一、系統原理 核心器件:MPU6050(集成3軸加速度計+陀螺儀) 主控芯片:STC89C52RC(51單片機) 顯示模塊:LCD1602液晶 工作原理: 通過MPU6050采集XYZ三軸加速度數據,利用重力加速度分量計算俯仰…