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

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

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

1. 什么是迭代器失效?

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

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

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

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

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

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

  • 如果 size() == capacity()(容量已滿)
    • vector 會重新分配更大的內(nèi)存,并拷貝原有數(shù)據(jù)。
    • 所有迭代器失效(包括 begin()end() 等)。
  • 如果 size() < capacity()(容量未滿)
    • 插入點(diǎn)之前的迭代器仍然有效。
    • 插入點(diǎn)及之后的迭代器失效(因為元素可能被移動)。

示例: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;         // ? 危險!it 可能失效

如何避免?

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

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

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

  • 被刪除元素的迭代器失效。
  • 被刪除元素之后的所有迭代器失效(因為后面的元素會向前移動)。
  • 刪除點(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;             // ? 危險!it 已經(jīng)失效(3 已經(jīng)前移)

如何正確刪除?

  • 使用 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. 總結(jié)

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

最佳實踐

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

鄂伦春自治旗| 乡城县| 张家港市| 大英县| 犍为县| 武川县| 教育| 丹寨县| 阜新| 米脂县| 通许县| 灯塔市| 天峨县| 巴青县| 区。| 海兴县| 桑植县| 时尚| 游戏| 安多县| 海淀区| 长垣县| 图片| 丹东市| 元阳县| 施甸县| 仙桃市| 瑞金市| 济源市| 温州市| 洛阳市| 望城县| 苍梧县| 文昌市| 太湖县| 绥宁县| 宽甸| 潼南县| 兴城市| 乳源| 普格县|