精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

迭代器失效:99% 的 C++ 程序員都會踩的坑 !

開發(fā)
迭代器失效看起來很復雜,但只要記住幾個簡單的規(guī)則,就能輕松避開這個坑。

嘿,各位 C++ 愛好者們,今天咱們聊一個幾乎所有 C++ 程序員都會踩的坑——迭代器失效。無論你是剛入門的新手,還是寫了好幾年代碼的老司機,這個問題都可能讓你的程序莫名其妙地崩潰。不過別擔心,讀完這篇文章,你一定會恍然大悟:"哦!原來是這么回事!"

一、迭代器到底是個啥?

先別急著談"失效",咱們得先弄明白迭代器是啥玩意兒。

想象一下,迭代器就像是一個"指針",指向容器(比如vector、list)中的某個元素。通過迭代器,我們可以訪問、修改容器中的元素,還能在容器中移動(前進或后退)。

簡單來說,迭代器就是容器和算法之間的橋梁,讓你能夠不關心容器內部結構,就能輕松遍歷和操作容器中的元素。

vector<int> nums = {1, 2, 3, 4, 5};
// it就是一個迭代器,指向vector的第一個元素
auto it = nums.begin(); 
cout << *it << endl; // 輸出1

二、什么是迭代器失效?

現在到了關鍵問題:什么是迭代器失效?

簡單講,當你對容器進行了某些操作后,原先有效的迭代器變得無效了,再使用這個迭代器就會導致未定義行為(通常是程序崩潰),這就是迭代器失效。

就好比你拿著一把鑰匙(迭代器)去開一個門(訪問容器元素),但有人趁你不注意把鎖換了(容器結構改變),你的鑰匙自然就不管用了。

三、常見的迭代器失效場景

1. vector中的迭代器失效

vector 是最常用的 STL 容器,也是迭代器失效最容易發(fā)生的地方。

場景一:添加元素(push_back)導致的失效

vector<int> nums = {1, 2, 3};
auto it = nums.begin(); // it指向1
nums.push_back(4);      // 可能導致迭代器失效
cout << *it << endl;    // 危險操作!可能崩潰

為啥會失效?因為 vector 在內存中是連續(xù)存儲的,當空間不夠時,會重新分配一塊更大的內存,并把原來的元素復制過去。這時候,原來的內存地址就變了,之前的迭代器自然就失效了。

就像你正在看一本書,突然有人把這本書拿走換了一本新的放在原處——你手指的位置自然就不對了。

場景二:insert 操作導致的失效

說到 vector 添加元素,咱們可不能忘了另一個常用的操作——insert!這家伙比 push_back 還要狡猾呢!

vector<int> nums = {1, 2, 3, 4, 5};
auto it = nums.begin() + 2; // it指向元素3
nums.insert(nums.begin(), 0); // 在最前面插入0
cout << *it << endl; // 危險操作!it已經失效了

為啥 insert 更容易讓人踩坑?因為 insert 有雙重殺傷力:

  • 首先,和 push_back 一樣,如果 vector 容量不夠,insert會導致重新分配內存,所有迭代器就全軍覆沒了。
  • 其次,即使沒有重新分配內存,insert也會讓插入位置及其后面的所有元素向后挪位置,這會使這些位置的迭代器全部"串位"。

打個比方,就像你排隊時,突然有人插隊到你前面,你和你后面的人都被迫向后移了一位——原來記錄的位置信息就全亂套了!

記住這個簡單規(guī)則:

  • 如果 insert 導致擴容:所有迭代器都 GG
  • 如果 insert 不導致擴容:插入位置及其后面的迭代器都 GG

場景三:刪除元素導致的失效

vector<int> nums = {1, 2, 3, 4, 5};
for (auto it = nums.begin(); it != nums.end(); ++it) {
    if (*it == 3) {
        nums.erase(it); // 迭代器失效
        cout << *it << endl;    // 不要繼續(xù)使用it,危險操作!可能崩潰 
    }
}

問題在哪?當你刪除了一個元素后,該位置后面的所有元素都會前移,原來的迭代器就指向了一個錯誤的位置。

2. list中的迭代器失效

list 是雙向鏈表,它的迭代器失效情況比 vector 要簡單些。

list<int> myList = {1, 2, 3, 4, 5};
auto it = myList.begin();
++it; // it指向2
myList.erase(it); // 刪除2,it失效
// 不能再使用it

對于 list,只有被刪除節(jié)點的迭代器會失效,其他節(jié)點的迭代器仍然有效。這是因為 list 是鏈表結構,刪除一個節(jié)點不會影響其他節(jié)點的內存位置。

3. map/set中的迭代器失效

map 和 set 是基于紅黑樹實現的,它們的迭代器失效規(guī)則和 list 類似。

map<int, string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}};
auto it = myMap.begin();
myMap.erase(it); // it失效
// 不能再使用it

同樣,只有被刪除元素的迭代器會失效,其他元素的迭代器仍然有效。

四、如何避免迭代器失效的坑?

知道了問題所在,我們該如何避免呢?這里有幾個實用技巧:

技巧一:使用 erase 和 insert 的返回值

大多數容器的 erase 方法都會返回下一個有效迭代器,insert會返回指向新插入元素的迭代器,我們可以利用這一點。

// erase的返回值
vector<int> nums = {1, 2, 3, 4, 5};
for (auto it = nums.begin(); it != nums.end(); ) {
    if (*it == 3) {
        it = nums.erase(it); // erase返回下一個有效迭代器
    } else {
        ++it;
    }
}

// insert的返回值
vector<int> nums2 = {1, 2, 3, 4};
auto it2 = nums2.begin();
it2 = nums2.insert(it2 + 2, 100); // it2現在指向新插入的100
cout << *it2 << endl; // 輸出100

這個技巧在需要連續(xù)操作容器時特別有用,可以保持迭代器始終有效。

技巧二:先記錄再刪除

vector<int> nums = {1, 2, 3, 4, 5};
vector<int> toRemove;

// 先標記要刪除的元素
for (int i = 0; i < nums.size(); ++i) {
    if (nums[i] == 3) {
        toRemove.push_back(i);
    }
}

// 從后往前刪除(避免索引變化)
for (int i = toRemove.size() - 1; i >= 0; --i) {
    nums.erase(nums.begin() + toRemove[i]);
}

技巧三:使用穩(wěn)定的容器操作

一些容器操作不會導致迭代器失效,可以優(yōu)先使用這些操作。

// 對于list,splice操作不會導致迭代器失效
list<int> myList = {1, 2, 3, 4, 5};
list<int> anotherList = {10, 20};
auto it = myList.begin();
++it; // it指向2
myList.splice(myList.end(), anotherList); // 不會導致it失效
cout << *it << endl; // 仍然是2

五、實戰(zhàn)案例:解決常見迭代器失效問題

案例一:刪除 vector 中的偶數

錯誤寫法:

vector<int> nums = {1, 2, 3, 4, 5, 6};
for (auto it = nums.begin(); it != nums.end(); ++it) {
    if (*it % 2 == 0) {
        nums.erase(it); // 錯誤!迭代器失效
    }
}

正確寫法:

vector<int> nums = {1, 2, 3, 4, 5, 6};
for (auto it = nums.begin(); it != nums.end(); ) {
    if (*it % 2 == 0) {
        it = nums.erase(it);
    } else {
        ++it;
    }
}

案例二:在遍歷的同時添加元素

錯誤寫法:

vector<int> nums = {1, 2, 3};
for (auto it = nums.begin(); it != nums.end(); ++it) {
    if (*it == 2) {
        nums.push_back(4); // 錯誤!可能導致迭代器失效
    }
}

正確寫法(使用下標):

vector<int> nums = {1, 2, 3};
int size = nums.size(); // 先記錄原始大小
for (int i = 0; i < size; ++i) {
    if (nums[i] == 2) {
        nums.push_back(4); // 使用索引而非迭代器
    }
}

六、總結

迭代器失效看起來很復雜,但只要記住幾個簡單的規(guī)則,就能輕松避開這個坑:

  • vector: 插入或刪除元素后,該位置及其后面的迭代器都會失效;如果重新分配內存,所有迭代器都會失效。
  • list/forward_list: 只有被刪除元素的迭代器會失效。
  • map/set/multimap/multiset: 只有被刪除元素的迭代器會失效。
  • unordered_map/unordered_set: 插入操作可能導致所有迭代器失效(rehash);刪除操作只會導致被刪除元素的迭代器失效。

實際編程中,優(yōu)先考慮使用現代 C++ 的算法和容器操作,比如remove_if和erase的組合,往往能更優(yōu)雅地解決問題:

vector<int> nums = {1, 2, 3, 4, 5, 6};
// 一行代碼刪除所有偶數
nums.erase(remove_if(nums.begin(), nums.end(), 
    [](int x) { return x % 2 == 0; }),
    nums.end());

怎么樣,迭代器失效這個坑,你現在是不是已經有底了?下次寫代碼的時候,別忘了提醒自己:容器變了,迭代器可能就不靠譜了!

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2024-12-17 17:24:24

2022-07-15 08:20:54

Java基礎知識

2025-04-03 12:30:00

C 語言隱式類型轉換代碼

2023-11-13 08:34:01

Java編程習慣

2024-03-13 13:10:48

JavaInteger緩存

2021-10-18 21:41:10

Go程序員 Defer

2012-11-08 09:49:30

C++Java程序員

2025-05-29 09:21:38

2025-03-11 08:20:00

C++main函數

2023-07-17 10:28:00

C/C++編程接口

2010-01-14 18:07:30

C++語言

2025-05-21 10:10:00

C++內存泄漏開發(fā)

2021-02-26 10:41:59

C++程序員代碼

2020-08-05 07:53:53

程序員網站技術

2018-02-06 08:36:02

簡歷程序員面試

2014-03-06 09:18:48

C++CIDE

2010-01-12 10:40:22

C++程序員

2021-10-15 06:49:37

MySQL

2011-05-24 17:20:57

程序員

2010-01-14 13:24:49

CC++語言
點贊
收藏

51CTO技術棧公眾號

天天成人综合网| 成人xvideos免费视频| 一起草在线视频| 欧美激情喷水| 国产精品色婷婷| 91久久伊人青青碰碰婷婷| 精品少妇theporn| 一本久久青青| 3d成人动漫网站| 欧美一区二区中文字幕| av在线三区| 国产福利91精品一区二区三区| 97精品久久久中文字幕免费| 国产午夜精品久久久久久久久| 国产精品日本一区二区不卡视频| 性做久久久久久| 少妇精品久久久久久久久久| 亚洲成a人片77777精品| 久久精品一区二区国产| 久久国产精品影片| 国产一二三四五区| 亚洲精品视频一二三区| 在线观看亚洲精品| 亚洲一区二区三区av无码| 国产精品一级伦理| 9l国产精品久久久久麻豆| 国产精品视频一| 日韩免费一级片| 欧美一区激情| 正在播放国产一区| 91精品小视频| 日韩一区免费| 欧美一区二区三区白人| 日韩av手机版| 美女福利一区二区| 午夜亚洲福利老司机| 天天爱天天做天天操| 国产在线视频资源| 99久久精品国产一区二区三区| 91精品在线一区| av网站中文字幕| 日韩视频久久| 精品中文字幕在线| 永久免费未视频| 国产亚洲一卡2卡3卡4卡新区| 精品国产免费视频| 成年人看片网站| 国产精品视频一区视频二区| 欧美日韩午夜在线| 中文字幕永久视频| 欧美日韩国产v| 天天综合天天做天天综合| 国产乱淫av片杨贵妃| 在线观看中文字幕的网站| 亚洲欧美色综合| 欧美性视频在线播放| 日本不卡三区| 中文字幕中文字幕在线一区 | 波多野结衣视频网站| 欧美1区2区| 九九热视频这里只有精品| 伊人在线视频观看| 小小影院久久| 美女av一区二区| 青青草偷拍视频| 欧美激情视频一区二区三区免费| 欧美大码xxxx| 国产一二三四在线| 国产欧美高清| 日本久久久久久久| 日韩xxx视频| 美女视频黄免费的久久 | 成人夜色视频网站在线观看| 国产98在线|日韩| 亚洲高清视频在线播放| 成人动漫在线一区| 久久精品日韩精品| 激情小说 在线视频| 中文子幕无线码一区tr| 中文字幕av导航| 日韩精品亚洲人成在线观看| 亚洲一区二区成人在线观看| 国产素人在线观看| 在线黄色的网站| 欧美三级三级三级爽爽爽| 最新免费av网址| 天堂久久av| 日韩精品免费电影| 阿v天堂2014| 中文字幕免费一区二区三区| 久久久欧美一区二区| 91久久国产综合久久91| 久久99国产精品尤物| 翡翠波斯猫1977年美国| 日本亚洲一区| 亚洲欧洲国产日韩| r级无码视频在线观看| 国模冰冰炮一区二区| 欧美色国产精品| 精品人妻一区二区三| 美女午夜精品| 日韩网站在线观看| 久久精品美女视频| 男女性色大片免费观看一区二区 | 美女撒尿一区二区三区| 中文字幕日韩一级| 久久成人免费电影| 精品国产综合久久| 国产欧美黑人| 日韩欧美精品中文字幕| 中文字幕 欧美日韩| 欧美黑人巨大videos精品| 日韩在线视频网站| 一级黄色免费网站| 国产精品一品视频| 日韩久久精品一区二区三区| 性欧美ⅴideo另类hd| 欧美亚洲一区二区在线观看| 午夜剧场免费看| 99久久精品费精品国产| 国产91av在线| www.色视频| 国产精品成人午夜| 三级a在线观看| 欧美亚洲tv| 久久999免费视频| 亚洲一卡二卡在线观看| 99精品久久只有精品| 日本老太婆做爰视频| 忘忧草在线www成人影院| 亚洲激情免费观看| 国产成人自拍网站| 久久精品国产一区二区三区免费看 | 成人免费看视频网站| 日韩美一区二区三区| 亚洲一级理论片| 久久只有精品| 久久精品久久精品国产大片| 毛片在线导航| 日韩一区二区三区免费观看| 午夜国产福利视频| 日韩av一二三| 色综合久久av| 欧美xxx视频| 亚洲男人天天操| 99热国产在线观看| 99视频有精品| 91视频最新入口| 色婷婷av一区二区三区丝袜美腿| 久久久久久网址| 黄色av中文字幕| 婷婷中文字幕综合| xxxwww国产| 日韩图片一区| 精品综合久久久| 国产精品25p| 亚洲精品视频免费在线观看| 啦啦啦免费高清视频在线观看| 国产成人亚洲综合a∨猫咪 | 午夜宅男久久久| 久久人人97超碰人人澡爱香蕉| 美女av在线免费看| 精品小视频在线| 91精品国产高清一区二区三密臀| 91麻豆国产自产在线观看| 欧美爱爱视频免费看| 台湾亚洲精品一区二区tv| 2019亚洲男人天堂| 欧美伦理影视网| 色综合久久久久久久久| 怡红院一区二区三区| 麻豆精品国产传媒mv男同| 一级做a爰片久久| 国产精品亚洲综合在线观看| 欧美二区乱c黑人| 性感美女视频一二三| 色香蕉成人二区免费| 女人十八毛片嫩草av| 美国av一区二区| 91精品国产毛片武则天| 久久资源综合| 国产精品久久久久秋霞鲁丝| 国产欧美黑人| 亚洲精品国产精品国自产在线| 日韩在线播放中文字幕| 国产精品的网站| 免费黄色a级片| 久久久久久婷| 性做爰过程免费播放| 国产美女撒尿一区二区| 国产福利成人在线| av片在线观看免费| 日韩黄在线观看| 国产精品第6页| 一卡二卡三卡日韩欧美| 免费的av网站| 久久aⅴ国产欧美74aaa| 国产高清av在线播放| 国产一区二区三区网| 91情侣偷在线精品国产| 欧美gv在线| 久久精品视频一| 国精产品一品二品国精品69xx| 色婷婷av一区二区三区gif| 久草视频手机在线| 久久女同性恋中文字幕| 少妇愉情理伦片bd| 视频一区二区三区中文字幕| 91精品国产吴梦梦| 精品freesex老太交| 波多野结衣一区二区三区在线观看| 高清不卡av| 欧美国产日本在线| 中文字幕日本在线| 日韩电视剧免费观看网站| 国产又黄又粗又猛又爽| 欧美视频在线观看免费| 欧美精品一区二区蜜桃| 中文字幕久久午夜不卡| 国产熟女高潮一区二区三区| 国产一区二区三区免费在线观看| 成人久久久久久久久| 中文字幕一区二区三区久久网站| 日本一区网站| 日本久久成人网| 不卡视频一区二区三区| 日韩一区中文| 国产精品第一页在线| 色黄视频在线观看| 欧美夫妻性生活xx| 久草免费在线| 中文字幕日韩有码| 黄色视屏网站在线免费观看| 亚洲国产精品热久久| 精品人妻aV中文字幕乱码色欲| 精品视频在线免费| 久久影视中文字幕| 欧美视频在线观看 亚洲欧| 国产精品99精品无码视| 一区二区三区高清| 欧美爱爱小视频| 中文字幕日韩av资源站| www.com.av| 国产精品久久免费看| 在线看片中文字幕| 国产欧美日韩精品a在线观看| 性欧美丰满熟妇xxxx性久久久| 不卡一区二区三区四区| 美女露出粉嫩尿囗让男人桶| 国产成人欧美日韩在线电影| 国产乱女淫av麻豆国产| 精品一区二区三区久久| 日韩成人精品视频在线观看| 蜜桃视频在线观看一区| 日本中文字幕精品—区二区| 美女脱光内衣内裤视频久久网站 | 国产剧情一区在线| 欧美性猛交xx| 国产成a人亚洲精品| 美女露出粉嫩尿囗让男人桶| av一区二区三区在线| 喷水视频在线观看| 久久综合九色综合欧美就去吻| 国产毛片毛片毛片毛片毛片毛片| www.欧美日韩| 欧美一区二区三区成人精品| 国产欧美视频一区二区| 日本美女bbw| 亚洲欧美综合网| 精品99久久久久成人网站免费 | 97久久久久久久| 欧美性xxxxx极品| 中文字幕免费视频观看| 精品视频一区二区不卡| 国产婷婷一区二区三区久久| 日韩欧美国产一二三区| 特黄aaaaaaaaa真人毛片| 亚洲精品视频中文字幕| 日本中文字幕视频在线| 欧美激情在线狂野欧美精品| 国产伦子伦对白在线播放观看| 国产成人极品视频| 精品国产三级| 久久精品第九区免费观看 | 亚洲免费成人av电影| av资源网站在线观看| 欧美激情视频免费观看| 美女高潮视频在线看| 国产欧美在线播放| 超碰成人免费| 天堂va久久久噜噜噜久久va| 综合久久精品| 成年人视频网站免费观看| 国产在线精品免费| 久久偷拍免费视频| 最新欧美精品一区二区三区| 国产精品免费av一区二区| 欧美日韩黄色影视| 女人18毛片一区二区三区| 一区二区三区美女xx视频| 福利在线视频网站| 日韩女优人人人人射在线视频| 欧美国产中文高清| 日本不卡在线播放| 欧美久久一区| www亚洲成人| 不卡av电影在线播放| 四虎地址8848| 欧美性69xxxx肥| 亚洲春色一区二区三区| 在线日韩精品视频| 国产直播在线| 99免费在线观看视频| 欧美伦理在线视频| 无码人妻精品一区二区三区在线| 久久97超碰国产精品超碰| 黄色录像a级片| 一区二区三区四区视频精品免费| 午夜久久久久久久久久影院| 精品第一国产综合精品aⅴ| 免费的黄网站在线观看| 国产91在线播放精品91| 动漫3d精品一区二区三区乱码| 最新欧美日韩亚洲| 老妇喷水一区二区三区| 精品中文字幕在线播放| 亚洲精品国产成人久久av盗摄| 中文字幕在线网址| 亚洲情综合五月天| 操人在线观看| 国产精品麻豆免费版| 中文字幕一区二区三区欧美日韩| 91国产精品视频在线观看| 久久久久久久久久看片| 九九热在线视频播放| 亚洲成人av在线| 免费男女羞羞的视频网站在线观看| 国产欧美亚洲视频| 久久久综合色| 男女视频在线看| 国产亚洲成年网址在线观看| 久久久久女人精品毛片九一| 日韩成人中文电影| bbw在线视频| 精品久久久三级| 亚洲看片一区| 中文字幕 日本| 婷婷中文字幕综合| 香港三日本三级少妇66| 26uuu亚洲国产精品| 欧美性生活一级片| 久久久久久久激情| 久久精品视频在线免费观看 | 黄色在线播放网站| 91久久综合亚洲鲁鲁五月天| 四虎成人精品永久免费av九九| 艹b视频在线观看| 国产精品电影一区二区| 92久久精品一区二区| 超碰精品一区二区三区乱码| 国产美女精品视频免费播放软件| 在线观看17c| 不卡视频一二三四| 久久久久久久久久久久久av| 亚洲久久久久久久久久久| 色老太综合网| 亚洲精品自在在线观看| 狠狠色2019综合网| 久久久久久国产精品视频| 亚洲国产成人91精品| 欧美xxx性| 亚洲美女自拍偷拍| 国产91精品在线观看| 国产区在线观看视频| 一区二区三区天堂av| www欧美在线观看| 欧美中文字幕在线观看视频| 91在线观看视频| 中文字幕在线2018| 欧美成人在线免费| 思热99re视热频这里只精品| 99热手机在线| 亚洲在线一区二区三区| 视频福利在线| 国产日韩欧美成人| 亚洲小说区图片区| 第一次破处视频| 日韩一级片网站| 久久青青视频| 视频一区二区视频| xnxx国产精品| 99视频在线观看免费| 97avcom| 水蜜桃久久夜色精品一区| 最新版天堂资源在线| 欧美色精品在线视频| av在线理伦电影| 一区二区精品免费视频| 99精品视频在线观看免费| 97精品人妻一区二区三区香蕉|