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

C++ 迭代器失效問題解決

 更新時(shí)間:2024年01月23日 15:52:44   作者:Faiz..  
在C++中,當(dāng)一個vector進(jìn)行了插入或刪除操作時(shí),其迭代器可能會失效,本文就來介紹一下C++ 迭代器失效問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下

1.vector迭代器失效問題

迭代器的主要作用就是讓算法能夠不用關(guān)心底層數(shù)據(jù)結(jié)構(gòu),其底層實(shí)際就是一個指針,或者是對指針進(jìn)行了封裝 ,比如: vector 的迭代器就是原生態(tài)指針 T* 。因此 迭代器失效,實(shí)際就是迭代器底層對應(yīng)指針?biāo)赶虻?/strong> 空間被銷毀了,而使用一塊已經(jīng)被釋放的空間 ,造成的后果是程序崩潰 ( 即 如果繼續(xù)使用已經(jīng)失效的迭代器, 程序可能會崩潰 ) 。

在C++中,當(dāng)一個vector進(jìn)行了插入或刪除操作時(shí),其迭代器可能會失效。這是因?yàn)樵诓迦牖騽h除操作之后,vector可能會重新分配內(nèi)存空間,導(dǎo)致原來的迭代器指向的位置不再有效。

可能會導(dǎo)致其迭代器失效的操作有

1.底層空間改變

1. 會引起其底層空間改變的操作,都有可能是迭代器失效 ,比如: resize 、 reserve 、 insert 、 assign 、push_back等。

#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<vector>

int main()
{
	vector<int> v;
	v = { 1,2,3,4,5,6 };
	auto it = v.begin();
	//使用reserve擴(kuò)容,可能會引起底層容量的改變,舊空間釋放,但是it依舊使用的時(shí)釋放前的舊空間
	v.reserve(100);
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}

	return 0;
}

我們使用resize 、 reserve 、 insert 、 assign、 push_back等操作都可能會導(dǎo)致擴(kuò)容, 也就是說vector底層原理舊空間被釋放掉, 而在打印時(shí),it還使用的是釋放之間的舊空間,在對it迭代器操作時(shí),實(shí)際操作的是一塊已經(jīng)被釋放的 空間,而引起代碼運(yùn)行時(shí)崩潰。

如果我們在擴(kuò)容后重新賦值即可解決這個問題,可以繼續(xù)操作it迭代器。

2.指定位置元素的刪除操作

#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<vector>

int main()
{
	vector<int> v;
	v = { 1,2,3,4,5,6 };
	//auto it = v.begin();
	//使用reserve擴(kuò)容,可能會引起底層容量的改變,舊空間釋放,但是it依舊使用的時(shí)釋放前的舊空間
	//v.reserve(100);
	auto it = v.begin();
	while (it != v.end())
	{
		v.erase(it);  //刪除it位置的數(shù)據(jù),導(dǎo)致迭代器失效
		//這時(shí)再對it進(jìn)行操作就是非法訪問
		cout << *it << endl;
		++it;
	}

	return 0;
}

如圖中代碼,運(yùn)行會崩潰

erase 刪除 pos 位置元素后, pos 位置之后的元素會往前搬移,沒有導(dǎo)致底層空間的改變,理論上講迭代器不應(yīng)該會失效,但是:如果pos 剛好是最后一個元素,刪完之后 pos 剛好是 end 的位置,而 end 位置是沒有元素的,那么pos 就失效了。因此刪除 vector 中任意位置上元素時(shí), vs 就認(rèn)為該位置迭代器失效了。

如果在刪除后對迭代器it重新賦值,這個時(shí)候就不會失效,因?yàn)閑rase返回刪除元素下一個位置元素的迭代器。

2.Linux下的迭代器失效檢測

Linux 下, g++ 編譯器對迭代器失效的檢測并不是非常嚴(yán)格,處理也沒有 vs 下極端。

1.擴(kuò)容

運(yùn)行如下代碼:

可以運(yùn)行但是結(jié)果已經(jīng)出錯。

2.刪除

運(yùn)行如下代碼

可以正常運(yùn)行,erase刪除任意位置代碼后,linux下迭代器并沒有失效 因?yàn)榭臻g還是原來的空間,后序元素往前搬移了,it的位置還是有效的

但是如果刪除的是最后一個元素呢

程序崩潰,因?yàn)閯h除最后一個元素,刪除后it已經(jīng)超過end,++it導(dǎo)致程序崩潰

3.解決方法

與 vector 類似, string 在插入 + 擴(kuò)容操作 +erase 之后,迭代器也會失效

迭代器失效解決辦法:在使用前,對迭代器重新賦值即可

1.在進(jìn)行插入或刪除操作之后,更新迭代器的位置,使其指向有效的元素。

2.在進(jìn)行插入或刪除操作之前,先將迭代器保存下來,然后再進(jìn)行操作之后重新定位迭代器。

3.另外,C++11引入了emplace_back()和emplace()函數(shù),它們可以在vector中直接構(gòu)造對象,而不是先創(chuàng)建臨時(shí)對象再插入,這樣可以減少迭代器失效的可能性 

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

相關(guān)文章

  • C++之異常處理詳解

    C++之異常處理詳解

    C++中處理異常的過程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個錯誤信息,把它傳遞給上一級的函數(shù)來解決,上一級解決不了,再傳給其上一級,由其上一級處理
    2013-08-08
  • C語言數(shù)據(jù)類型轉(zhuǎn)換實(shí)例代碼

    C語言數(shù)據(jù)類型轉(zhuǎn)換實(shí)例代碼

    本文主要介紹C 語言數(shù)據(jù)類型轉(zhuǎn)換,這里通過代碼實(shí)例進(jìn)行詳解,這是C語言基礎(chǔ)部分,需要的朋友可以參考下
    2016-07-07
  • C語言基礎(chǔ)知識變量的作用域和存儲方式詳細(xì)介紹

    C語言基礎(chǔ)知識變量的作用域和存儲方式詳細(xì)介紹

    這篇文章主要介紹了C語言基礎(chǔ)知識變量的作用域和存儲方式詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C?C++輸入輸出基礎(chǔ)教程示例詳解

    C?C++輸入輸出基礎(chǔ)教程示例詳解

    當(dāng)我們在網(wǎng)站做題的時(shí)候經(jīng)常會遇到各種要求的輸入輸出,而且會有時(shí)間超限等多個問題,這時(shí)我們就要優(yōu)化我們的輸入輸出或者規(guī)范我們的輸入輸出格式,下面介紹C和C++中的輸入輸出問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-11-11
  • Qt實(shí)現(xiàn)簡易毛玻璃效果的示例代碼

    Qt實(shí)現(xiàn)簡易毛玻璃效果的示例代碼

    這篇文章主要介紹了Qt如何利用模糊功能實(shí)現(xiàn)簡易的毛玻璃效果,并且鼠標(biāo)可以移動無邊框窗口,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • opencv實(shí)現(xiàn)三幀差法解析

    opencv實(shí)現(xiàn)三幀差法解析

    這篇文章主要介紹了opencv實(shí)現(xiàn)三幀差法的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C程序?qū)崿F(xiàn)整數(shù)的素?cái)?shù)和分解問題

    C程序?qū)崿F(xiàn)整數(shù)的素?cái)?shù)和分解問題

    這篇文章主要介紹了C程序?qū)崿F(xiàn)整數(shù)的素?cái)?shù)和分解問題,對于算法的學(xué)習(xí)有不錯的借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C++ Leetcode實(shí)現(xiàn)從英文中重建數(shù)字

    C++ Leetcode實(shí)現(xiàn)從英文中重建數(shù)字

    本文主要介紹了當(dāng)給你一個字符串s,其中包含字母順序打亂的用英文單詞表示的若干數(shù)字(0-9)時(shí),如何通過Leetcode按升序返回原始的數(shù)字。感興趣的童鞋可以來看看
    2021-11-11
  • C++實(shí)現(xiàn)LeetCode(132.拆分回文串之二)

    C++實(shí)現(xiàn)LeetCode(132.拆分回文串之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(132.拆分回文串之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例

    C語言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例

    這篇文章主要介紹了C語言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評論

延长县| 兴和县| 都匀市| 车致| 博野县| 瑞安市| 凤台县| 额济纳旗| 徐汇区| 景东| 霍邱县| 娄烦县| 藁城市| 凭祥市| 宜章县| 邵阳县| 衡水市| 青神县| 巴彦县| 石嘴山市| 米脂县| 炎陵县| 赣榆县| 扶风县| 新蔡县| 正宁县| 长寿区| 台安县| 岳阳市| 嘉义县| 博爱县| 丹凤县| 沭阳县| 遂宁市| 于田县| 团风县| 惠水县| 普洱| 托克托县| 东明县| 富宁县|