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

C++迭代器失效的避坑指南

 更新時(shí)間:2025年05月11日 13:39:08   作者:tanyongxi66  
在?C++?中,迭代器(iterator)?是一種類似指針的對(duì)象,用于遍歷?STL?容器(如?vector、list、map?等),迭代器失效?是指在對(duì)容器進(jìn)行某些操作后,原本有效的迭代器變得不可用,所以本文介紹了C++迭代器失效的避坑指南,需要的朋友可以參考下

1. 什么是迭代器失效?

在 C++ 中,迭代器(iterator) 是一種類似指針的對(duì)象,用于遍歷 STL 容器(如 vector、list、map 等)。

迭代器失效是指在對(duì)容器進(jìn)行某些操作(如插入、刪除)后,原本有效的迭代器變得不可用,繼續(xù)使用它會(huì)導(dǎo)致 未定義行為(Undefined Behavior, UB),如程序崩潰、數(shù)據(jù)錯(cuò)誤等

2. 哪些操作會(huì)導(dǎo)致迭代器失效?

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

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

當(dāng)向 vector 插入元素時(shí):

  • 如果 size() == capacity()(容量已滿)
    • vector 會(huì)重新分配更大的內(nèi)存,并拷貝原有數(shù)據(jù)。
    • 所有迭代器失效(包括 begin()end() 等)。
  • 如果 size() < capacity()(容量未滿)
    • 插入點(diǎn)之前的迭代器仍然有效。
    • 插入點(diǎn)及之后的迭代器失效(因?yàn)樵乜赡鼙灰苿?dòng))。

示例:push_back 導(dǎo)致迭代器失效

vector<int> v = {1, 2, 3};
auto it = v.begin(); // it 指向 1
v.push_back(4);      // 可能觸發(fā)重新分配內(nèi)存
cout << *it;         // ? 危險(xiǎn)!it 可能失效

如何避免?

  • 提前預(yù)留空間reserve()):
vector<int> v;
v.reserve(100);    // 預(yù)留 100 個(gè)元素的空間
auto it = v.begin();
v.push_back(1);    // 不會(huì)重新分配,it 仍然有效
  • 使用索引代替迭代器(如果允許)。

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

當(dāng)從 vector 刪除元素時(shí):

  • 被刪除元素的迭代器失效
  • 被刪除元素之后的所有迭代器失效(因?yàn)楹竺娴脑貢?huì)向前移動(dòng))。
  • 刪除點(diǎn)之前的迭代器仍然有效。

示例:erase 導(dǎo)致迭代器失效

vector<int> v = {1, 2, 3, 4};
auto it = v.begin() + 2; // it 指向 3
v.erase(v.begin() + 1);  // 刪除 2
cout << *it;             // ? 危險(xiǎn)!it 已經(jīng)失效(3 已經(jīng)前移)

如何正確刪除?

  • 使用 erase 的返回值(返回下一個(gè)有效迭代器):
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不會(huì)失效僅被刪除的失效
map/set不會(huì)失效僅被刪除的失效

4. 總結(jié)

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

最佳實(shí)踐

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

以上就是C++迭代器失效的避坑指南的詳細(xì)內(nèi)容,更多關(guān)于C++迭代器失效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • socket多人聊天程序C語言版(二)

    socket多人聊天程序C語言版(二)

    這篇文章主要為大家詳細(xì)介紹了socket多人聊天程序C語言版第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C++中的Primer拷貝、賦值與銷毀詳解

    C++中的Primer拷貝、賦值與銷毀詳解

    這篇文章主要介紹了C++中的Primer拷貝、賦值與銷毀方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 淺談C++11的std::function源碼解析

    淺談C++11的std::function源碼解析

    類模版std::function是一種通用的多態(tài)函數(shù)包裝器std::function的實(shí)例可以對(duì)任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲(chǔ)、復(fù)制、和調(diào)用操作,本文詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06
  • C語言之詳解靜態(tài)變量static

    C語言之詳解靜態(tài)變量static

    在C語言中static是用來修飾變量和函數(shù)的,這篇文章詳細(xì)介紹了static主要作用,文章中有詳細(xì)的代碼實(shí)例,需要的朋友可以參考閱讀
    2023-04-04
  • 超詳細(xì)解析C++實(shí)現(xiàn)快速排序算法的方法

    超詳細(xì)解析C++實(shí)現(xiàn)快速排序算法的方法

    快速排序是比較快的排序方法。它的基本思想是通過一組排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,本文將用C++實(shí)現(xiàn)快速排序算法,需要的可以參考一下
    2022-09-09
  • 使用C語言實(shí)現(xiàn)字符串逆序操作案例

    使用C語言實(shí)現(xiàn)字符串逆序操作案例

    這篇文章主要介紹了使用C語言實(shí)現(xiàn)字符串逆序操作案例,本文包含使用C語言的兩種方法去實(shí)現(xiàn),遞歸和非遞歸,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++構(gòu)造函數(shù)初始化列表的實(shí)現(xiàn)詳解

    C++構(gòu)造函數(shù)初始化列表的實(shí)現(xiàn)詳解

    構(gòu)造函數(shù)主要作用在于創(chuàng)建對(duì)象時(shí)為對(duì)象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無須手動(dòng)調(diào)用;析構(gòu)函數(shù)主要作用在于對(duì)象銷毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一 些清理工作
    2022-09-09
  • 解讀C++編程中類模板的三種特化

    解讀C++編程中類模板的三種特化

    這篇文章主要介紹了C++編程中類模板的三種特化,需要的朋友可以參考下
    2016-01-01
  • 使用C++一步步實(shí)現(xiàn)俄羅斯方塊后續(xù)

    使用C++一步步實(shí)現(xiàn)俄羅斯方塊后續(xù)

    本文主要給大家分享的是作者在使用C++制作俄羅斯方塊小游戲的時(shí)候所需要的常用的函數(shù),有需要的小伙伴可以借鑒下,希望大家能夠喜歡。
    2017-12-12
  • 簡單總結(jié)C++中的修飾符類型

    簡單總結(jié)C++中的修飾符類型

    這篇文章主要介紹了C++中的修飾符類型總結(jié),是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-05-05

最新評(píng)論

隆尧县| 永寿县| 土默特左旗| 江油市| 岳西县| 尉犁县| 西青区| 南乐县| 黄冈市| 黎城县| 肇东市| 宜城市| 会同县| 峨边| 德清县| 沙洋县| 益阳市| 杭锦旗| 乌拉特中旗| 漠河县| 新野县| 瓦房店市| 乐陵市| 巫山县| 德安县| 黄石市| 唐山市| 太保市| 平邑县| 陇西县| 赫章县| 灵丘县| 民和| 上饶县| 皋兰县| 广南县| 丹东市| 武隆县| 镇远县| 包头市| 宝应县|