欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

迭代器失效

定義

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

以 vector 為例說明

插入操作導致的迭代器失效

? 當在vector中插入元素時,如果插入操作導致了內(nèi)存重新分配,那么所有指向該vector的迭代器都會失效。這是因為vector的存儲是連續(xù)的內(nèi)存空間,當插入元素使得當前容量不夠時,vector會重新分配一塊更大的內(nèi)存空間,將原來的元素復制或移動到新的空間中,原來的迭代器所指向的內(nèi)存地址就不再有效。

例:

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

調(diào)整一下:

刪除操作導致的迭代器失效

? 在vector中刪除元素后,被刪除元素之后的迭代器都會失效。這是因為刪除元素會導致后面的元素向前移動,迭代器原本指向的元素位置發(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
    // 此時it已經(jīng)失效,下面的操作可能會導致程序出錯
    std::cout << *it << std::endl;
    return 0;
}

以 list 為例說明

插入操作

? 對于list容器,插入操作不會導致迭代器失效。因為list是由節(jié)點組成的鏈表結構,插入新節(jié)點只是修改節(jié)點之間的鏈接關系,迭代器指向的節(jié)點本身并沒有改變。

? 例如:

#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中刪除一個元素后,只有指向被刪除元素的迭代器會失效。其他迭代器不受影響,因為鏈表結構的特點使得刪除操作只是調(diào)整節(jié)點之間的連接,不會像vector那樣引起其他元素的移動。

? 例如:

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

? 又如:

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

對于關聯(lián)容器(以map為例),插入操作不會導致迭代器失效,因為插入新元素只是在紅黑樹(map通常的底層實現(xiàn))中添加一個節(jié)點,不會改變已有節(jié)點的地址。

刪除操作會導致指向被刪除元素的迭代器失效,但其他迭代器仍然有效,因為紅黑樹的結構調(diào)整不會影響其他節(jié)點的內(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;
}

總結 

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

相關文章

  • C語言判定一棵二叉樹是否為二叉搜索樹的方法分析

    C語言判定一棵二叉樹是否為二叉搜索樹的方法分析

    這篇文章主要介紹了C語言判定一棵二叉樹是否為二叉搜索樹的方法,結合實例形式綜合對比分析了C語言針對二叉搜索樹判定的原理、算法、效率及相關實現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • 一問學會QT時間類

    一問學會QT時間類

    QT獲取時間的類有3個,分別是QDate、QTime、QDateTime,他們屬于QT的network模塊。本文詳細的介紹了這3個模塊的使用,感興趣的可以了解一下
    2023-04-04
  • vs2022項目文件夾內(nèi).vs文件夾容量虛高問題的解決

    vs2022項目文件夾內(nèi).vs文件夾容量虛高問題的解決

    經(jīng)常會發(fā)現(xiàn)VS的項目文件夾占用空間很大,本文主要介紹了vs2022項目文件夾內(nèi).vs文件夾容量虛高問題的解決,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C語言實現(xiàn)停車場管理

    C語言實現(xiàn)停車場管理

    這篇文章主要為大家詳細介紹了C語言課程設計之停車場管理問題,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言文件打開的模式

    C語言文件打開的模式

    這篇文章主要介紹了C語言文件打開的模式,以及相關的原理和知識點做了分享,有興趣的朋友參考學習下。
    2018-03-03
  • 數(shù)組循環(huán)移位操作實例

    數(shù)組循環(huán)移位操作實例

    這篇文章介紹了數(shù)組循環(huán)移位操作實例,有需要的朋友可以參考一下
    2013-09-09
  • Linux?C/C++實現(xiàn)網(wǎng)絡流量分析工具

    Linux?C/C++實現(xiàn)網(wǎng)絡流量分析工具

    網(wǎng)絡流量分析的原理基于對數(shù)據(jù)包的捕獲、解析和統(tǒng)計分析,通過對網(wǎng)絡流量的細致觀察和分析,幫助管理員了解和優(yōu)化網(wǎng)絡的性能,本文將通過C++實現(xiàn)網(wǎng)絡流量分析工具,有需要的可以參考下
    2023-10-10
  • C語言中的盜賊(小偷)問題詳解

    C語言中的盜賊(小偷)問題詳解

    大家好,本篇文章主要講的是C語言中的盜賊(小偷)問題詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++實現(xiàn)靜態(tài)鏈表

    C++實現(xiàn)靜態(tài)鏈表

    這篇文章主要為大家詳細介紹了C++實現(xiàn)靜態(tài)鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++實現(xiàn)LeetCode(191.位1的個數(shù))

    C++實現(xiàn)LeetCode(191.位1的個數(shù))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(191.位1的個數(shù)),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論