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

C++迭代器失效解決辦法詳解

 更新時(shí)間:2024年12月31日 08:32:35   作者:Octopus2077  
這篇文章主要介紹了迭代器失效的概念,以及在vector、list和map等容器中插入和刪除操作導(dǎo)致迭代器失效的情況,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

迭代器失效

定義

? 迭代器失效是指在使用迭代器遍歷容器(如vector、list、map等)的過(guò)程中,由于容器內(nèi)部結(jié)構(gòu)發(fā)生了變化,導(dǎo)致原來(lái)的迭代器不再有效,不能正確地指向它原本所指向的元素或者不能按照預(yù)期的方式進(jìn)行遍歷。

以 vector 為例說(shuō)明

插入操作導(dǎo)致的迭代器失效

? 當(dāng)在vector中插入元素時(shí),如果插入操作導(dǎo)致了內(nèi)存重新分配,那么所有指向該vector的迭代器都會(huì)失效。這是因?yàn)関ector的存儲(chǔ)是連續(xù)的內(nèi)存空間,當(dāng)插入元素使得當(dāng)前容量不夠時(shí),vector會(huì)重新分配一塊更大的內(nèi)存空間,將原來(lái)的元素復(fù)制或移動(dòng)到新的空間中,原來(lái)的迭代器所指向的內(nèi)存地址就不再有效。

例:

#include <iostream>
#include <vector>
int main() {
    std::vector<int> v = {1, 2, 3};
    auto it = v.begin();
    v.push_back(4);  // 插入元素可能導(dǎo)致內(nèi)存重新分配
    // 此時(shí)it可能已經(jīng)失效,下面的操作可能會(huì)導(dǎo)致程序出錯(cuò)
    std::cout << *it << std::endl;
    return 0;
}

調(diào)整一下:

刪除操作導(dǎo)致的迭代器失效

? 在vector中刪除元素后,被刪除元素之后的迭代器都會(huì)失效。這是因?yàn)閯h除元素會(huì)導(dǎo)致后面的元素向前移動(dòng),迭代器原本指向的元素位置發(fā)生了改變。

如:

#include <iostream>
#include <vector>
int main() {
    std::vector<int> v = {1, 2, 3, 4};
    auto it = v.begin() + 1;  // 指向元素2
    v.erase(it);  // 刪除元素2
    // 此時(shí)it已經(jīng)失效,下面的操作可能會(huì)導(dǎo)致程序出錯(cuò)
    std::cout << *it << std::endl;
    return 0;
}

以 list 為例說(shuō)明

插入操作

? 對(duì)于list容器,插入操作不會(huì)導(dǎo)致迭代器失效。因?yàn)閘ist是由節(jié)點(diǎn)組成的鏈表結(jié)構(gòu),插入新節(jié)點(diǎn)只是修改節(jié)點(diǎn)之間的鏈接關(guān)系,迭代器指向的節(jié)點(diǎn)本身并沒(méi)有改變。

? 例如:

#include <iostream>
#include <list>
int main() {
    std::list<int> l = {1, 2, 3};
    auto it = l.begin();
    l.insert(it, 0);  // 在頭部插入元素0
    std::cout << *it << std::endl;  // it仍然有效,輸出1
    return 0;
}

刪除操作

? 在list中刪除一個(gè)元素后,只有指向被刪除元素的迭代器會(huì)失效。其他迭代器不受影響,因?yàn)殒湵斫Y(jié)構(gòu)的特點(diǎn)使得刪除操作只是調(diào)整節(jié)點(diǎn)之間的連接,不會(huì)像vector那樣引起其他元素的移動(dòng)。

? 例如:

#include <iostream>
#include <list>
int main() {
    std::list<int> l = {1, 2, 3};
    auto it = l.begin();
    l.erase(it);  // 刪除第一個(gè)元素1
    // it已經(jīng)失效,不能再使用
    // 可以重新獲取迭代器來(lái)遍歷
    for (auto new_it = l.begin(); new_it!= l.end(); ++new_it) {
        std::cout << *new_it << std::endl;
    }
    return 0;
}

? 又如:

在關(guān)聯(lián)容器中的情況

對(duì)于關(guān)聯(lián)容器(以map為例),插入操作不會(huì)導(dǎo)致迭代器失效,因?yàn)椴迦胄略刂皇窃诩t黑樹(map通常的底層實(shí)現(xiàn))中添加一個(gè)節(jié)點(diǎn),不會(huì)改變已有節(jié)點(diǎn)的地址。

刪除操作會(huì)導(dǎo)致指向被刪除元素的迭代器失效,但其他迭代器仍然有效,因?yàn)榧t黑樹的結(jié)構(gòu)調(diào)整不會(huì)影響其他節(jié)點(diǎn)的內(nèi)存位置。
? 例如:

#include <iostream>
#include <map>
int main() {
    std::map<int, int> m = {{1, 10}, {2, 20}};
    auto it = m.find(1);
    m.erase(it);  // 刪除鍵為1的元素
    // it已經(jīng)失效,不能再使用
    for (auto new_it = m.begin(); new_it!= m.end(); ++new_it) {
        std::cout << new_it->first << " " << new_it->second << std::endl;
    }
    return 0;
}

總結(jié) 

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

相關(guān)文章

最新評(píng)論

吉林省| 瓦房店市| 天柱县| 漳浦县| 东源县| 梁平县| 浪卡子县| 正定县| 云龙县| 朔州市| 南康市| 岫岩| 凭祥市| 沁源县| 武城县| 昌吉市| 长乐市| 邵东县| 榆林市| 临沂市| 婺源县| 城口县| 宜宾市| 日喀则市| 乌拉特后旗| 临泉县| 达拉特旗| 乌恰县| 泸定县| 逊克县| 玛曲县| 东兰县| 梁山县| 武威市| 桂平市| 吴川市| 曲周县| 巴楚县| 黄山市| 班玛县| 长子县|