精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久婷婷成人综合色| 亚洲美女91| 欧美成人bangbros| 欧美牲交a欧美牲交| 第一福利在线| 国产精品 欧美精品| 欧美一区三区三区高中清蜜桃| 性欧美精品中出| 我要色综合中文字幕| 欧美视频免费在线| 91看片淫黄大片91| 国内精品一区视频| 成人av网址在线观看| 国产精品免费久久久| 国产精品第九页| 99久久婷婷| 亚洲美女激情视频| 99热这里只有精品2| 日韩三级影视| 亚洲.国产.中文慕字在线| 亚洲精品不卡| 欧美性孕妇孕交| 国产福利一区在线观看| 国产精品露脸av在线| 黄色激情视频在线观看| 国产精品久久久久无码av| 亚洲精品视频在线观看视频| 日本高清免费在线视频| 91大神在线观看线路一区| 午夜精品久久久久久久久久久 | wwwxxx黄色片| 国产美女一区视频| 亚洲精品精品亚洲| 最新不卡av| 日本在线天堂| 欧美国产亚洲另类动漫| 韩日午夜在线资源一区二区| 国产suv一区二区| 精品一区二区三区在线播放视频| 国产成人在线视频| 国产区一区二区三| 在线亚洲自拍| 性色av一区二区三区免费| 丰满少妇高潮久久三区| 香蕉久久网站| www.午夜精品| 麻豆精品国产免费| 91精品1区| 久久夜色精品国产亚洲aⅴ| youjizz亚洲女人| 奇米影视亚洲| 日韩中文字幕网站| 亚洲少妇xxx| 欧美r级电影| 色哟哟网站入口亚洲精品| av手机在线播放| 国产一区二区三区网| 亚洲石原莉奈一区二区在线观看| 无码人妻aⅴ一区二区三区| 日韩精品a在线观看91| 亚洲国产精品字幕| 超碰97人人干| 欧美美女视频| 久久精品视频va| 岛国毛片在线观看| 亚洲日韩成人| 国产国产精品人在线视| 亚洲精品国产精品国自产网站按摩| 日日夜夜免费精品视频| 国产精品自产拍在线观看| 国产又粗又猛又黄| 国产福利一区二区三区视频在线| 147欧美人体大胆444| 性做久久久久久久久久| 不卡av在线免费观看| 久久大香伊蕉在人线观看热2| 久热av在线| 中文字幕不卡在线| 免费在线精品视频| 黄色污网站在线观看| 色8久久精品久久久久久蜜| 小明看看成人免费视频| 亚洲日本一区二区三区在线| 亚洲激情电影中文字幕| 人人妻人人澡人人爽| 久久久久久久久国产一区| 久久久久久免费精品| 亚洲国产成人精品女人久久| 久久99久久久欧美国产| 国产伦精品一区二区三区视频孕妇| 网站黄在线观看| 国产精品久久久久影视| 国产精品久久久久9999爆乳| 向日葵视频成人app网址| 制服丝袜在线91| 日韩片在线观看| 亚洲国产精品久久久天堂| 午夜精品一区二区三区在线视频 | 欧美精品一区二区三区很污很色的 | 精品欧美视频| 亚洲欧美综合v| 免费在线观看日韩| 日韩成人dvd| 国产精品久久国产三级国电话系列| 美女毛片在线看| 一片黄亚洲嫩模| 在线观看国产一级片| 久久影视三级福利片| 日韩一中文字幕| 麻豆成人免费视频| 成人性生交大片免费看视频在线 | av一区观看| 超碰国产在线| 精品国产31久久久久久| www.污污视频| 精品理论电影在线| 97视频在线观看播放| 精品人妻久久久久一区二区三区| 久久精品视频一区二区三区| www插插插无码免费视频网站| 福利一区和二区| 亚洲欧洲激情在线| 日产欧产va高清| 丁香网亚洲国际| 亚洲综合欧美日韩| 日韩经典一区| 亚洲欧美日韩精品久久| 国产精品变态另类虐交| 国产一区二区三区香蕉| 香蕉久久夜色| 精品欧美日韩精品| 亚洲欧美制服另类日韩| 99精品视频99| 99久久精品久久久久久清纯| 视色,视色影院,视色影库,视色网| 欧美综合社区国产| 精品国模在线视频| 91午夜交换视频| 18成人在线观看| 五月天开心婷婷| 亚欧美无遮挡hd高清在线视频| 国产精品一区二区三区在线播放| 国产高清在线| 在线观看视频91| 精品人妻一区二区三区四区| 三级久久三级久久| 欧美精品一区在线| se01亚洲视频| 一区二区三区久久精品| 欧美高清69hd| 国产精品国模大尺度视频| 亚洲欧美日韩综合网| 欧美电影《睫毛膏》| 国产日韩欧美自拍| 青青影院在线观看| 欧美一级久久久| www.天天色| 26uuu亚洲| 日韩视频免费在线播放| 欧美疯狂party性派对| 91九色精品视频| 亚洲七七久久综合桃花剧情介绍| 欧美一级精品大片| 成年人免费看毛片| 久久精品欧美一区二区三区不卡| 日本新janpanese乱熟| 国产精品久久久久久| 亚洲一区中文字幕| 91桃色在线观看| 亚洲三级 欧美三级| 中文字幕人妻互换av久久| 国产精品久久久久久妇女6080| 三日本三级少妇三级99| 亚洲精品免费观看| 日韩理论片在线观看| 精品中文在线| 45www国产精品网站| 99re在线视频| 日韩欧美黄色影院| 日韩在线 中文字幕| 国产精品传媒入口麻豆| 天天躁日日躁狠狠躁av| 先锋影音久久久| 男女爱爱视频网站| 日韩精品免费一区二区三区竹菊| 国产视频福利一区| caoprom在线| 中文字幕日韩视频| 成人久久久精品国产乱码一区二区 | 久久亚洲春色中文字幕| 欧美综合视频在线| 欧美日韩情趣电影| 久久久精品视频免费| 国产清纯美女被跳蛋高潮一区二区久久w| 国产无遮挡猛进猛出免费软件| 欧美久久一区| 视频一区三区| 国产成人av毛片| 国产拍精品一二三| 黄色在线看片| 日韩一区视频在线| 国产在线91| 亚洲精品国产suv| 国产免费一区二区三区最新不卡 | 九九热在线精品视频| 免费毛片在线| 亚洲成人av片| www.热久久| 欧美精品aⅴ在线视频| 国产成人在线视频观看| 一区二区久久久久久| 日本黄区免费视频观看| www国产精品av| 色哟哟无码精品一区二区三区| 捆绑调教美女网站视频一区| 国产精品秘入口18禁麻豆免会员| 欧美成人日本| 免费成人深夜夜行网站视频| 九九热爱视频精品视频| 国产日韩在线一区二区三区| 免费精品一区| 成人美女免费网站视频| 日韩av电影资源网| 欧美自拍视频在线观看| 爱啪视频在线观看视频免费| 久久99精品视频一区97| 欧美性videos| 色婷婷久久一区二区| 欧美精品少妇| 亚洲人午夜色婷婷| 欧美zozo| 亚洲欧美在线磁力| 国产中文字幕在线视频| 日韩大片在线观看视频| 日韩在线观看视频一区| 亚洲成**性毛茸茸| 人妻无码中文字幕免费视频蜜桃| 日韩视频免费观看高清在线视频| 国产精品久久免费| 宅男噜噜噜66一区二区66| 91在线你懂的| 在线不卡中文字幕| 国产又黄又大又粗的视频| 欧美三级日韩在线| 又污又黄的网站| 欧美日韩亚洲国产综合| 中文字幕观看在线| 欧美片网站yy| 97精品人妻一区二区三区香蕉| 欧美日韩一区二区在线视频| 中文av免费观看| 在线播放中文一区| 国产草草影院ccyycom| 免费人成视频在线| 视频二区不卡| 国产91免费看片| 欧美18—19sex性hd| 热99精品里视频精品| japanese23hdxxxx日韩| 国产成人精品免费久久久久 | 精品少妇av| 亚洲一区二区精品在线| 亚洲激情中文在线| 久久成人福利视频| 亚洲欧美日韩专区| 99re精彩视频| 国产成人综合网站| 无码精品一区二区三区在线播放| 国产亚洲精品久| 性生交大片免费全黄| 亚洲免费av网站| 欧美亚洲精品天堂| 欧美日韩一区成人| 亚洲国产剧情在线观看| 精品视频久久久久久| 日韩美女网站| 亚洲 日韩 国产第一| 国产第一亚洲| 国产精品亚洲不卡a| 狠狠做深爱婷婷综合一区| 一本二本三本亚洲码| 一区二区日韩免费看| 欧美三级理论片| 丁香亚洲综合激情啪啪综合| 亚洲精品国产精品国自产网站| 亚洲精品美国一| 三级视频在线观看| 欧美一区二区三区在| 香蕉视频成人在线| 久久久精品免费视频| 日韩av一卡| 91香蕉嫩草影院入口| 日韩av字幕| 在线播放 亚洲| 久久成人在线| 亚洲精品鲁一鲁一区二区三区 | 紧身裙女教师波多野结衣| 亚洲成a人v欧美综合天堂下载| 五月天中文字幕| 亚洲精品久久久久中文字幕二区| 欧美性天天影视| 欧美影院在线播放| 伊人久久大香线蕉av超碰| 日韩免费三级| 亚洲欧美网站| 国产亚洲精品成人a| 中文字幕亚洲成人| 黄色av一区二区| 亚洲精品成人久久电影| 18视频在线观看| 国产精品爽爽ⅴa在线观看| 日韩高清成人在线| www.日本在线播放| 国产福利精品一区二区| 亚洲欧美精品久久| 欧美图片一区二区三区| 深夜福利在线看| 久久久亚洲国产天美传媒修理工| 国产精品一区二区三区av| 亚洲高清在线播放| 日韩国产精品大片| 中日韩精品一区二区三区| 亚洲 欧美综合在线网络| 精品国产九九九| 久久精品视频在线观看| 国产成人久久精品麻豆二区| 欧美日韩最好看的视频| 噜噜噜在线观看免费视频日韩 | 日韩综合网站| 蜜臀久久99精品久久久酒店新书| 91小视频免费看| 日本高清www免费视频| 亚洲国产古装精品网站| 牛牛精品视频在线| 俄罗斯精品一区二区三区| 亚洲美女视频| www.色.com| 一区二区欧美国产| 亚洲AV无码精品国产| 久久69精品久久久久久国产越南| 北岛玲精品视频在线观看| 伊人久久99| 国产一区 二区 三区一级| 我家有个日本女人| 欧美岛国在线观看| av2020不卡| 久久久影院一区二区三区| 国产精品毛片在线| 91国模少妇一区二区三区| 一本久道久久综合中文字幕| 理论视频在线| 国产精品免费福利| 在线中文一区| 李丽珍裸体午夜理伦片| 精品久久香蕉国产线看观看亚洲| 五月婷婷丁香六月| 日本欧美爱爱爱| 日韩在线观看一区 | 亚洲精品91天天久久人人| 国产一区二区三区精品久久久| 黄色精品视频| 警花观音坐莲激情销魂小说| 成人一区二区三区| 黄色免费av网站| 日韩在线一区二区三区免费视频| 在线视频成人| 精品少妇在线视频| 国产亚洲综合在线| a级片免费视频| 91福利视频网| 成人直播大秀| www.四虎在线| 欧洲精品一区二区| 中日韩高清电影网| 免费成人深夜夜行视频| 美日韩一区二区三区| 久久久久久久久久久网| 亚洲美女av在线| 亚洲日本中文| 国产91在线视频观看| 1000部国产精品成人观看| 欧美性受xxxx狂喷水| 国产精品久久久久久久久免费看 | 午夜激情久久久| 在线观看av黄网站永久| 91免费版黄色| 日韩精品亚洲一区二区三区免费| 伊人久久久久久久久久久久久久| 亚洲福利小视频| 四虎成人精品一区二区免费网站| 精品一区二区三区无码视频| 国产视频在线观看一区二区三区| 99久久久无码国产精品免费| 热99精品只有里视频精品| 欧美激情第二页| 免费黄色在线网址| 亚洲精品国精品久久99热 | 亚洲国产精品99| 日韩欧美专区| 人妻熟女一二三区夜夜爱|