最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中迭代器失效的實現(xiàn)

 更新時間:2026年03月27日 09:23:33   作者:Ralph_Y  
本文主要介紹了C++中迭代器失效的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

迭代器失效是C++容器使用中最常見的坑之一,核心定義是:迭代器指向的內(nèi)存位置(或容器的內(nèi)部結構)發(fā)生了非法改變,導致后續(xù)對該迭代器的解引用、遞增/遞減等操作觸發(fā)未定義行為(如程序崩潰、數(shù)據(jù)錯亂)

迭代器本質(zhì)是“容器元素的指針/索引抽象”,當容器的底層內(nèi)存布局、元素位置被修改時,迭代器就會失去對有效元素的指向,這就是“失效”。

一、迭代器失效的核心原因

迭代器失效的根本是容器底層結構被破壞,主要分為兩類:

  1. 內(nèi)存重分配:容器擴容時,原有內(nèi)存被釋放并重新分配(如vector擴容),迭代器指向的舊內(nèi)存地址失效;
  2. 元素位置改變/刪除:容器內(nèi)元素的物理位置移動(如vector插入元素)、元素被刪除,導致迭代器指向的位置不再是原元素(或變?yōu)榭眨?/li>

二、不同容器的迭代器失效場景(高頻考點)

不同容器的底層數(shù)據(jù)結構不同,迭代器失效的場景差異極大,以下是面試/實戰(zhàn)中最??嫉娜萜鳎?/p>

1. 順序容器(vector/deque/string)

(1)vector(動態(tài)數(shù)組)

操作迭代器失效情況原因
push_back()/emplace_back()僅當容器擴容時,所有迭代器/指針/引用失效;未擴容時,僅end()迭代器失效擴容會重新分配內(nèi)存,舊內(nèi)存被釋放;未擴容時,尾部插入不影響已有元素,但end()指向的位置改變
insert(pos, ...)插入位置后的所有迭代器失效;若擴容,所有迭代器失效插入元素導致后續(xù)元素后移,位置改變;擴容則內(nèi)存重分配
erase(pos)被刪除位置及之后的所有迭代器失效后續(xù)元素前移,被刪除位置的迭代器指向無效,后續(xù)迭代器指向的元素位置改變
clear()所有迭代器失效所有元素被刪除,迭代器無有效指向

示例(vector迭代器失效)

#include <vector>
using namespace std;
int main() {
    vector<int> vec = {1,2,3,4};
    auto it = vec.begin() + 1; // 指向2
    vec.erase(it); // 刪除2,it失效(指向原位置,現(xiàn)在是3,但迭代器已非法)
    // *it = 10; // 未定義行為:解引用失效的迭代器,可能崩潰
    // 正確做法:用erase的返回值更新迭代器
    it = vec.begin() + 1; // 重新指向3
    it = vec.erase(it);   // erase返回下一個有效迭代器(指向4)
    return 0;
}

(2)string(字符數(shù)組,同vector邏輯)

insert/erase/append等操作觸發(fā)內(nèi)存重分配或元素移動時,迭代器失效,規(guī)則與vector完全一致。

(3)deque(雙端隊列)

  • 頭部/尾部插入/刪除:僅end()迭代器失效,其他迭代器仍有效;
  • 中間插入/刪除:所有迭代器失效;
  • 擴容:所有迭代器失效(deque的內(nèi)存是分段的,擴容可能重組分段)。

2. 關聯(lián)容器(map/set/multimap/multiset)

關聯(lián)容器底層是紅黑樹(節(jié)點式結構),迭代器失效場景極少:

操作迭代器失效情況原因
insert()所有迭代器均有效(僅end()可能失效)紅黑樹插入節(jié)點僅調(diào)整結構,不移動已有節(jié)點,迭代器指向的節(jié)點內(nèi)存不變
erase(pos)僅被刪除的迭代器失效,其他迭代器均有效刪除節(jié)點僅釋放該節(jié)點內(nèi)存,其他節(jié)點位置不變

示例(map迭代器失效)

#include <map>
using namespace std;
int main() {
    map<int, string> mp = {{1,"a"},{2,"b"},{3,"c"}};
    auto it = mp.find(2); // 指向{2,"b"}
    mp.erase(it); // it失效,其他迭代器(如指向1、3的)仍有效
    // *it; // 未定義行為:解引用失效的迭代器
    // 正確做法:刪除前記錄下一個迭代器
    for (auto it = mp.begin(); it != mp.end(); ) {
        if (it->first == 3) {
            mp.erase(it++); // 先++獲取下一個迭代器,再刪除當前
        } else {
            ++it;
        }
    }
    return 0;
}

3. 無序容器(unordered_map/unordered_set)

底層是哈希表(桶+鏈表/紅黑樹),迭代器失效場景:

操作迭代器失效情況原因
insert()僅當哈希表擴容(負載因子超限)時,所有迭代器失效;未擴容時,僅end()失效擴容會重新哈希并分配桶,迭代器指向的舊桶位置失效
erase(pos)僅被刪除的迭代器失效,其他迭代器有效刪除僅釋放當前節(jié)點,哈希表結構未變

三、迭代器失效的解決方案(實戰(zhàn)避坑)

1. 核心原則:操作后更新迭代器

  • erase操作:利用erase的返回值(指向刪除位置的下一個有效迭代器)更新迭代器;
    // vector正確刪除元素(避免迭代器失效)
    for (auto it = vec.begin(); it != vec.end(); ) {
        if (*it == 2) {
            it = vec.erase(it); // 用返回值更新迭代器
        } else {
            ++it;
        }
    }
  • insert操作:插入后重新獲取迭代器(或利用insert返回值);
    auto it = vec.insert(vec.begin()+1, 10); // insert返回指向新元素的迭代器

2. 避免在循環(huán)中復用失效迭代器

  • 不要在容器修改操作(insert/erase/resize)后,使用之前保存的迭代器;
  • 若需多次訪問,每次操作后重新獲取迭代器(如it = vec.find(xxx))。

3. 選擇合適的容器

  • 若需頻繁插入/刪除且要求迭代器穩(wěn)定:優(yōu)先用list(雙向鏈表,所有插入/刪除僅失效被刪迭代器)、map/set(紅黑樹,迭代器穩(wěn)定性高);
  • 若需隨機訪問:用vector,但需注意擴容/插入后的迭代器更新。

4. 禁用失效迭代器的所有操作

迭代器失效后,*禁止解引用(it)、遞增(++it)、遞減(–it) 等任何操作,即使程序暫時不崩潰,也屬于未定義行為,后續(xù)可能觸發(fā)隱蔽bug。

四、迭代器失效的典型坑點

  1. 循環(huán)中直接erase迭代器
    // 錯誤:erase后it失效,++it觸發(fā)未定義行為
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        if (*it == 2) vec.erase(it);
    }
    
  2. 擴容后復用舊迭代器
    vector<int> vec;
    auto it = vec.begin();
    for (int i=0; i<10000; i++) vec.push_back(i); // 觸發(fā)擴容,it失效
    *it = 10; // 崩潰:解引用失效迭代器
  3. map遍歷刪除時未保存下一個迭代器
    // 錯誤:erase(it)后it失效,++it非法
    for (auto it = mp.begin(); it != mp.end(); ++it) {
        if (it->first == 2) mp.erase(it);
    }

總結(核心要點回顧)

  1. 迭代器失效定義:迭代器指向的內(nèi)存/元素位置非法,操作該迭代器觸發(fā)未定義行為;
  2. 失效核心原因:容器內(nèi)存重分配(vector擴容)、元素位置移動(vector插入)、元素刪除;
  3. 關鍵解決方案
    • 順序容器(vector/deque):用erase/insert的返回值更新迭代器;
    • 關聯(lián)容器(map/set):刪除前保存下一個迭代器,僅失效被刪迭代器;
    • 避免復用修改操作后的舊迭代器。

到此這篇關于C++中迭代器失效的實現(xiàn)的文章就介紹到這了,更多相關C++ 迭代器失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在C/C++與Python之間實現(xiàn)通信的常見方法

    在C/C++與Python之間實現(xiàn)通信的常見方法

    在C/C++與Python之間實現(xiàn)通信的方式有很多,本文給大家介紹了一些常見的方法,文中通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • C語言分支和循環(huán)詳解

    C語言分支和循環(huán)詳解

    C語言是一門結構化的程序設計語言,當C語言用來描述生活中的事物時,會用到三種結構:順序結構(不去贅述),選擇結構(對應分支語句),循環(huán)結構(對應循環(huán)語句),分支語句:分支語句分為兩種,一種是if語句,一種是switch語句
    2021-10-10
  • 使用C語言訪問51單片機中存儲器的核心代碼

    使用C語言訪問51單片機中存儲器的核心代碼

    這篇文章主要介紹了使用C語言訪問51單片機中存儲器的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • 淺談C#中List<T>對象的深度拷貝問題

    淺談C#中List<T>對象的深度拷貝問題

    下面小編就為大家?guī)硪黄獪\談C#中List<T>對象的深度拷貝問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Qt GUI圖形圖像開發(fā)之QT表格控件QTableView,QTableWidget復雜表頭(多行表頭) 及凍結、固定特定的行的詳細方法與實例

    Qt GUI圖形圖像開發(fā)之QT表格控件QTableView,QTableWidget復雜表頭(多行表頭) 及凍結、固定特

    這篇文章主要介紹了Qt GUI圖形圖像開發(fā)之QT表格控件QTableView,QTableWidget復雜表頭(多行表頭) 及凍結、固定特定的行的詳細方法與實例,需要的朋友可以參考下
    2020-03-03
  • 關于C++為什么不加入垃圾回收機制解析

    關于C++為什么不加入垃圾回收機制解析

    C++為什么不加入垃圾回收機制呢?現(xiàn)在肯定還有很多人不太了解,不過沒關系,下面小編就為大家詳細的介紹下究竟C++為什么不加入垃圾回收機制。一起跟隨小編過來看看吧
    2017-01-01
  • C++ ReSharper2021激活碼永久有效

    C++ ReSharper2021激活碼永久有效

    ReSharperC++是為c/c++開發(fā)者打造的一款實用Visual Studio擴展插件,這款插件旨在提升開發(fā)者的效率,今天給大家分享這款軟件的激活方法,需要C++ ReSharper2021激活碼的朋友參考下本文
    2021-06-06
  • C++簡單實現(xiàn)shared_ptr的代碼

    C++簡單實現(xiàn)shared_ptr的代碼

    智能指針用于資源管理,為了保證資源的操作得到順利的執(zhí)行防止資源泄露,因此大多數(shù)實現(xiàn)都以noexcept在參數(shù)列表后聲明為不拋出異常,這篇文章主要介紹了C++簡單實現(xiàn)shared_ptr的代碼,需要的朋友可以參考下
    2022-09-09
  • 詳細理解函C語言的函數(shù)棧幀

    詳細理解函C語言的函數(shù)棧幀

    這篇文章主要為大家介紹了C語言的函數(shù)棧幀,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助
    2021-11-11
  • C語言中const與指針使用方法總結

    C語言中const與指針使用方法總結

    這篇文章主要介紹了C語言中const與指針使用方法總結的相關資料,需要的朋友可以參考下
    2017-10-10

最新評論

临城县| 广平县| 汨罗市| 镇宁| 南涧| 雅安市| 永德县| 石首市| 定南县| 贵南县| 舟山市| 赞皇县| 仁寿县| 文成县| 竹北市| 汝阳县| 洪洞县| 都兰县| 西丰县| 旺苍县| 永州市| 香格里拉县| 嵊州市| 丽江市| 正定县| 罗甸县| 靖西县| 三都| 高要市| 库尔勒市| 广宁县| 黄冈市| 永新县| 名山县| 广丰县| 辽源市| 博乐市| 错那县| 崇义县| 松阳县| 灌南县|