国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C++中vector迭代器哪些情況下會失效?

開發(fā) 前端
為了避免由于迭代器失效引起的錯誤,我們在使用迭代器遍歷vector時,要避免在可能使迭代器失效的操作前后更新迭代器,或者盡量減少對vector的修改操作直到遍歷完成。

在C++編程中,std::vector是一個非常強大的容器,用于存儲動態(tài)數(shù)組。然而,使用std::vector時需要注意的一個重要方面是其迭代器的行為。當vector的容量發(fā)生變化時(例如添加或刪除元素),迭代器可能會失效,這可能導致程序錯誤。

迭代器失效的情況:

1、重新分配內(nèi)存

當向vector添加新元素導致其容量不足時,vector會自動擴展以容納更多的元素。這種情況下,所有指向舊內(nèi)存區(qū)域的迭代器、指針和引用都會失效。

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec = {1, 2, 3};
    auto it = vec.begin(); // 指向第一個元素


    // 添加一個元素可能觸發(fā)重新分配
    vec.push_back(4);


    if (it != vec.end()) {
        std::cout << "Element: " << *it << std::endl;
    } else {
        std::cout << "Iterator is invalid." << std::endl;
    }


    return 0;
}

在這個例子中,如果push_back()操作觸發(fā)了重新分配,則it迭代器將變得無效,嘗試訪問它會導致未定義行為。

2、刪除元素

從vector中移除元素后,該位置之后的所有元素及其對應的迭代器都會受到影響。

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it = vec.erase(vec.begin()); // 刪除第一個元素


    while (it != vec.end()) {
        std::cout << *it << " ";
        ++it;
    }
    std::cout << std::endl;


    return 0;
}

這里,erase()返回的是下一個有效元素的迭代器,確保了循環(huán)的安全性。

3、使用 clear() 方法清空容器

當調(diào)用clear()時,所有元素都會被刪除,但已分配的內(nèi)存空間不會被釋放。這意味著容器的容量保持不變,但所有指向原元素的迭代器、指針或引用都將變得無效。

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it = vec.begin(); // 獲取開始位置的迭代器


    std::cout << "Before clear: Capacity = " << vec.capacity() << ", Size = " << vec.size() << std::endl;


    vec.clear(); // 清空向量


    std::cout << "After clear: Capacity = " << vec.capacity() << ", Size = " << vec.size() << std::endl;


    if (it != vec.end()) {
        // 這里會輸出錯誤信息,因為it已經(jīng)失效
        std::cout << "Element: " << *it << std::endl;
    } else {
        std::cout << "Iterator is invalid after calling clear()." << std::endl;
    }


    return 0;
}

調(diào)用clear()后,迭代器it仍然指向原來的內(nèi)存位置,但由于這些位置上的元素已被刪除,所以it實際上是無效的。為了安全起見,應該在clear()之后重新獲取迭代器。

4、使用 resize() 改變大小

減小尺寸:如果通過resize()減小vector的尺寸,那么超出新尺寸范圍的元素會被刪除,相應的迭代器也會失效。

增大尺寸:如果增加尺寸,則新增加的位置上的迭代器是未定義的(直到它們被初始化)。

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it = vec.begin() + 2; // 指向第三個元素


    std::cout << "Before resize: Capacity = " << vec.capacity() << ", Size = " << vec.size() << std::endl;
    std::cout << "Element at it before resize: " << *it << std::endl;


    vec.resize(2); // 減小尺寸到2


    std::cout << "After resizing to 2: Capacity = " << vec.capacity() << ", Size = " << vec.size() << std::endl;
    if (it != vec.end()) {
        // 這里可能會導致未定義行為,因為it已經(jīng)失效
        std::cout << "Element at it after resize: " << *it << std::endl;
    } else {
        std::cout << "Iterator is invalid after resizing to 2." << std::endl;
    }


    vec.resize(6, 0); // 增大尺寸到6,并用0填充
    it = vec.begin() + 2; // 重新獲取有效迭代器


    std::cout << "After resizing to 6: Capacity = " << vec.capacity() << ", Size = " << vec.size() << std::endl;
    std::cout << "Element at it after resizing to 6: " << *it << std::endl;


    return 0;
}

5、使用 swap() 交換兩個 vector 的內(nèi)容

當兩個vector之間進行數(shù)據(jù)交換時,它們各自的迭代器、指針和引用都將指向?qū)Ψ降臄?shù)據(jù)結(jié)構(gòu)。這意味著原來的迭代器將不再指向原來的數(shù)據(jù)。

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec1 = {1, 2, 3};
    std::vector<int> vec2 = {4, 5, 6};


    auto it1 = vec1.begin();
    auto it2 = vec2.begin();


    std::cout << "Before swap: vec1[0] = " << *it1 << ", vec2[0] = " << *it2 << std::endl;


    vec1.swap(vec2); // 交換兩個向量的內(nèi)容


    std::cout << "After swap: vec1[0] = " << *it1 << ", vec2[0] = " << *it2 << std::endl;


    // 輸出顯示迭代器現(xiàn)在指向了交換后的數(shù)據(jù)
    std::cout << "it1 now points to: " << *it1 << std::endl;
    std::cout << "it2 now points to: " << *it2 << std::endl;


    return 0;
}

6、使用 assign() 重新賦值

assign()可以用來替換vector中的所有元素,這個過程類似于先調(diào)用clear()再插入新元素。因此,任何之前存在的迭代器都會失效。

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it = vec.begin();


    std::cout << "Before assign: Element at it = " << *it << std::endl;


    vec.assign(3, 0); // 用3個0替換原有元素


    if (it != vec.end()) {
        // 這里會導致未定義行為,因為it已經(jīng)失效
        std::cout << "After assign: Element at it = " << *it << std::endl;
    } else {
        std::cout << "Iterator is invalid after assign." << std::endl;
    }


    // 重新獲取有效的迭代器
    it = vec.begin();
    std::cout << "New element at it: " << *it << std::endl;


    return 0;
}

vector刪除經(jīng)典錯誤

當從vector中刪除一個元素時,所有指向該元素及其之后元素的迭代器都會失效。如果繼續(xù)使用這些迭代器,會導致未定義行為。

下面這個是新手最容易犯的一個錯誤:

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};


    for (auto it = vec.begin(); it != vec.end(); ++it) {
        if (*it == 3) {
            vec.erase(it); // 刪除元素3
        }
        std::cout << *it << " "; // 繼續(xù)使用失效的迭代器
    }
    std::cout << std::endl;


    return 0;
}

當*it == 3時,調(diào)用vec.erase(it)會刪除元素3。

erase()返回的是下一個有效元素的迭代器,但在這個例子中,it并沒有更新為新的迭代器,而是繼續(xù)遞增,導致訪問已失效的迭代器。

正確的做法是:

#include <iostream>
#include <vector>


int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};


    for (auto it = vec.begin(); it != vec.end(); ) {
        if (*it == 3) {
            it = vec.erase(it); // 更新迭代器
        } else {
            ++it; // 只有在沒有刪除元素的情況下才遞增迭代器
        }
    }


    for (const auto &val : vec) {
        std::cout << val << " ";
    }
    std::cout << std::endl;


    return 0;
}

總結(jié):

為了避免由于迭代器失效引起的錯誤,我們在使用迭代器遍歷vector時,要避免在可能使迭代器失效的操作前后更新迭代器,或者盡量減少對vector的修改操作直到遍歷完成。此外,使用基于范圍的for循環(huán)(如for (auto &elem : vec))可以避免直接管理迭代器,從而簡化代碼并減少出錯的機會。

責任編輯:武曉燕 來源: CppPlayer
相關(guān)推薦

2021-04-15 08:01:27

Spring聲明式事務

2015-06-01 06:39:18

JavaJava比C++

2015-06-29 14:23:13

JavaC++慢很多

2024-08-01 08:29:45

Spring參數(shù)類型

2025-04-29 08:30:00

迭代器失效C++編程

2010-02-04 15:51:07

C++迭代器

2010-02-06 16:05:51

C++ Vector

2021-12-13 11:12:41

Spring事務失效

2010-01-28 14:11:43

C++迭代器

2021-11-08 15:17:15

變量Defer 失效

2024-12-01 18:29:42

2023-11-23 23:52:06

options請求瀏覽器

2021-06-04 09:17:13

JavaScriptBoolean函數(shù)

2022-06-27 07:23:44

MySQL常量優(yōu)化

2022-09-14 19:50:22

事務場景流程

2009-12-01 11:39:39

配置路由器IP

2020-04-02 11:16:28

Linux進程高并發(fā)

2013-09-12 10:41:39

VDI部署

2023-03-27 13:00:13

Javascript前端

2009-12-09 10:41:26

配置靜態(tài)路由
點贊
收藏

51CTO技術(shù)棧公眾號

久久大香伊蕉在人线观看热2| 在线观看亚洲a| 另类小说视频一区二区| 国产精品久久久久影院色老大 | 久久久91精品| 亚洲乱码一区二区三区 | 九九热在线免费| 久久综合色一本| 一区二区小说| 自拍偷拍亚洲区| 菠萝蜜视频国产在线播放| 亚洲女性喷水在线观看一区| 国产成人精品免费看在线播放 | 日韩电视剧免费观看网站| 91九色在线porn| 欧美日韩激情小视频| 在线看av的网址| 国产日产欧产精品推荐色| 91精品午夜视频| 国模 一区 二区 三区| 国产精品91在线观看| 午夜av成人| 精品国产亚洲在线| 国产精品久久久久aaaa| 在线观看成人黄色| 激情伊人五月天| 九色视频在线播放| 成人看片毛片免费播放器| 国产亚洲福利| 日韩精品在线观看一区二区| 亚洲黄色av网址| **欧美日韩在线| 亚洲成精国产精品女| 国产激情小视频在线| 欧美三级免费观看| 蜜臀av免费观看| 欧美福利精品| 韩国自拍一区| 日产精品一线二线三线芒果| 日本美女一区二区三区| 欧美性受黑人性爽| 国产亚洲欧美日韩俺去了| 色av一区二区三区| 欧美色老头old∨ideo| 手机av在线| 91成人在线视频| 国产精品大片免费观看| 亚洲精品人成| 欧美国产一区二区| 欧美69xxxxx| 亚洲精品一区中文| 色天天色综合| 欧美成人蜜桃| 成人欧美一区二区三区在线湿哒哒| 免费超碰在线| 男女精品视频| 精品国产露脸精彩对白| 日本www高清视频| 大片网站久久| 99精品国产福利在线观看免费| 中文在线一区二区| 四虎永久在线| 亚洲精品国产精品国自产观看浪潮| 国产精品视频一区二区三区综合| 国产精品美女网站| 久久精品国产秦先生| 成人综合网址| 精品久久免费看| 麻豆成人入口| 亚洲日本精品| 综合久久久久久久| av中文在线资源库| 国产精品第七影院| 精品在线一区二区三区| 三上悠亚在线观看二区| 国产偷亚洲偷欧美偷精品| 精品国精品国产自在久国产应用| 亚洲欧美日韩另类精品一区二区三区| 亚洲国产成人一区二区三区| 日本a级在线| 91精品国产91| 美女视频黄a大片欧美| 99爱视频在线观看| 日韩精品黄色网| 成人区精品一区二区婷婷| 图片区小说区区亚洲五月| 一区二区三区四区乱视频| 一个人www视频在线免费观看| 国产精品一区二区久久精品| 成人免费精品视频| 黄网站免费在线播放| 国产精品久久久久久久久借妻 | 亚洲午夜激情av| 天然素人一区二区视频| 国产激情一区二区三区在线观看 | 欧美综合激情| 婷婷开心激情综合| 久久久精品区| 一区二区不卡在线观看| 色婷婷精品大视频在线蜜桃视频| 91成人在线网站| 中文字幕一区二区三区四区五区人 | 国产日韩av在线| 国产亚洲一区二区三区在线观看 | 人妻无码一区二区三区四区| 777午夜精品视频在线播放| 国产成人短视频在线观看| 日本少妇高潮喷水视频| 亚洲精品电影网| 亚洲一区二区伦理| 黄色片免费在线| 国产精品久久久久久久av大片 | 国产精品亚洲人成在99www| 女人帮男人橹视频播放| 欧美不卡一区二区三区四区| 欧美成人嫩草网站| 色视频www在线播放| 国产成人a亚洲精品| 国产精品久久久久久久久搜平片| 精品久久毛片| 成人av在线播放观看| 日韩精品免费在线播放| 欧美96一区二区免费视频| 丁香在线视频| 国产黑人绿帽在线第一区| 亚洲欧美怡红院| 免费一区二区| eeuss在线播放| 日产精品99久久久久久| 中文字幕一区三区| 色愁久久久久久| 在线播放evaelfie极品| 国产精品99蜜臀久久不卡二区| 中文字幕亚洲视频| 香蕉视频一区二区三区| 永久免费的av网站| 国产精品成人av性教育| 精品福利一区二区| 影音先锋日韩资源| 色婷婷av在线| 美女av免费观看| 久久高清视频免费| 亚洲欧洲无码一区二区三区| 成人三级视频| 日本视频不卡| 一区二区精品免费视频| 中文字幕精品一区二区精品| 久久免费视频一区| 国产成人影院| av网站在线播放| 亚洲精品tv久久久久久久久| 亚洲性无码av在线| 久久精品日产第一区二区三区高清版| 欧美一区 二区| 青青青草原在线| 日本精品一区| 最好看的2019的中文字幕视频| 久久精品水蜜桃av综合天堂| 亚欧日韩另类中文欧美| 九色丨porny丨| 国产伦精品一区二区三区视频孕妇 | 777亚洲妇女| 国产91丝袜在线18| 999久久精品| 最近最新中文字幕在线| 国产精品v欧美精品v日韩| 精品国产乱码久久久久久夜甘婷婷| 国产综合久久久久影院| 超碰97久久国产精品牛牛| 欧美精品少妇| 高清无码一区二区在线观看吞精| 97在线免费观看视频| 日韩欧美一区视频| 国产成人在线观看| 国产成人1区| 91福利区在线观看| 国产美女在线免费观看| 欧美日韩综合另类| 欧美大奶子在线| 色嗨嗨av一区二区三区| 成人综合在线网站| 天天射成人网| 国产69精品久久| 国产小视频在线| 国产视频一视频二| 国产精品yjizz| 欧美成人精品一区二区| 欧美日韩国产免费一区二区| 91亚洲国产成人精品一区二区三 | 欧美激情一二三区| 黄页网站一区| 国产精品久久免费视频 | 色综合天天综合| av网站一区二区三区| 欧美日本一区二区高清播放视频| 精品美女一区| a级网站在线播放| 日本中文字幕电影| 日日摸日日碰夜夜爽无码| 国产欧美亚洲日本|