" />

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

C/C++迭代器的失效問(wèn)題詳解

 更新時(shí)間:2022年03月27日 16:07:26   作者:貧僧愛(ài)用飄柔  
這篇文章主要為大家詳細(xì)介紹了C/C++迭代器的失效問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

前言

我今天在使用迭代器時(shí)發(fā)現(xiàn)了一個(gè)問(wèn)題,這個(gè)問(wèn)題就是我在使用的迭代器時(shí)發(fā)現(xiàn)莫名其妙的有越界訪問(wèn)和獲取的位置跟預(yù)期不符,經(jīng)過(guò)一天的排查我發(fā)現(xiàn)不是所有情況下會(huì)出現(xiàn)這種問(wèn)題,而是在容器刪除和擴(kuò)容時(shí)會(huì)發(fā)生越界或結(jié)果和預(yù)期不符的情況。

下面是我今天做的一些代碼測(cè)試:

Text1

該函數(shù)的功能是把數(shù)組里面的所有偶數(shù)刪除,遍歷方式使用的是迭代器。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
 {
 	vector<int> v{ 1, 2, 3, 4, 5, 6 };
	auto it = v.begin();
 	while (it != v.end()) 
 	{
 		if (!(*it % 2)) 
		{
			v.erase(it);
 		}
		++it; 
	}

	return 0;
 }

當(dāng)我運(yùn)行起來(lái)時(shí)發(fā)現(xiàn)有越界訪問(wèn)和結(jié)果不符合預(yù)期這兩種情況。

我們接著往下看下一個(gè)出問(wèn)題的測(cè)試代碼:

Test2

該函數(shù)的功能是想改變指定位置為30

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
 	vector<int> v{ 1, 2, 3, 4, 5 };
  	auto pos =find(v.begin(), v.end(), 3);
   	v.reserve(100);
    *pos = 30;
 	return 0;
}

當(dāng)該程序運(yùn)行起來(lái)我發(fā)現(xiàn)出現(xiàn)了越界問(wèn)題!

上面的問(wèn)題我思考了許久都沒(méi)想明白于是我開(kāi)始去網(wǎng)找答案我找了一天看了數(shù)篇文章,終于解開(kāi)困擾我多天的問(wèn)題出現(xiàn)上述情況是因?yàn)?strong>迭代器失效了??!! 。

迭代器失效

迭代器失效并不是說(shuō)迭代器就是完全失效而是會(huì)出現(xiàn)以下兩種情況:

1.迭代器的意義變了

2.迭代器完全失效

情況1是指迭代器沒(méi)完全失效只是它表示的意義和原來(lái)的意思不同了,如果不做處理的話會(huì)導(dǎo)致運(yùn)行結(jié)果會(huì)預(yù)期有偏差。如出現(xiàn)Test1那樣的結(jié)果本來(lái)是想把所有偶數(shù)刪掉結(jié)果迭代器失效了導(dǎo)致部分沒(méi)刪掉且還有越界訪問(wèn)風(fēng)險(xiǎn)。

那么,這種問(wèn)題有什么較好的解決方案呢?其實(shí)很簡(jiǎn)單我們每次進(jìn)行操作的時(shí)候都要更新下迭代器坐標(biāo)即可

Test1修改后

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
 {
 	vector<int> v{ 1, 2, 3, 4, 5, 6 };
	auto it = v.begin();
 	while (it != v.end()) 
 	{
 		if (!(*it % 2)) 
		{
            //由于刪除導(dǎo)致迭代器失效,所以我們重新更新下迭代器即可
			it = v.erase(it);
 		}
		else
        {
            //當(dāng)?shù)鞑皇桥紨?shù)是才移動(dòng),如果所有情況都迭代的話會(huì)導(dǎo)致迭代器失效
			++it; 
        }
	}

	return 0;
 }

情況2是指迭代器完全不能用了,如果還堅(jiān)持使用會(huì)發(fā)生越界訪問(wèn),因?yàn)榇藭r(shí)的迭代器已經(jīng)是一個(gè)野指針了迭代器的底層都是一個(gè)指針來(lái)維護(hù)的,當(dāng)?shù)魍耆б馕吨摰鞒蔀榱艘爸羔槨?/p>

Test2 是想修改指定位置的值,但是在修改前發(fā)生了一次擴(kuò)容而該擴(kuò)容就是導(dǎo)致迭代器失效的罪魁禍?zhǔn)?,因?yàn)榘l(fā)生擴(kuò)容的話原來(lái)的空間會(huì)被丟棄重新開(kāi)辟一段內(nèi)存來(lái)使用,而迭代器的底層是一個(gè)指針,它還指向之前的內(nèi)存而該內(nèi)存因?yàn)楸会尫帕怂晕覀儧](méi)有了使用權(quán)此時(shí)的迭代器也就成為了野指針。

那么,這種問(wèn)題如何解決呢?其實(shí)和上一個(gè)問(wèn)題的解決方案一樣,當(dāng)?shù)骺赡軙?huì)發(fā)生變化時(shí)我們需要對(duì)迭代器進(jìn)行一個(gè)更新確保它是有效的迭代器。

Test2修改后

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
 	vector<int> v{ 1, 2, 3, 4, 5 };
  	auto pos =find(v.begin(), v.end(), 3);
  	//擴(kuò)容導(dǎo)致迭代器成為野指針
   	v.reserve(100);
   	//這時(shí)如果還想更改指定位置的值,那么我們需要進(jìn)行一個(gè)迭代器的更新
  	pos =find(v.begin(), v.end(), 3);
    *pos = 30;
 	return 0;
}

總結(jié)

當(dāng)使用迭代器時(shí)只要內(nèi)存或迭代器會(huì)發(fā)生變化,那么我們需要對(duì)迭代器進(jìn)行一次更新確保它每次操作都一定是有效的,從而避免迭代器失效造成的越界訪問(wèn)和預(yù)期不符的情況。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!    

相關(guān)文章

  • Qt中QScrollArea控件的實(shí)現(xiàn)

    Qt中QScrollArea控件的實(shí)現(xiàn)

    QScrollArea是Qt框架中用于提供一個(gè)滾動(dòng)條區(qū)域,允許用戶滾動(dòng)查看比當(dāng)前可視區(qū)域更大的內(nèi)容的控件,本文主要介紹了Qt中QScrollArea控件的實(shí)現(xiàn),感興趣的可以了解一下
    2025-04-04
  • MATLAB中count函數(shù)用法示例代碼

    MATLAB中count函數(shù)用法示例代碼

    這篇文章主要介紹了MATLAB中的count函數(shù),用于計(jì)算字符串中模式的出現(xiàn)次數(shù),它可以處理單個(gè)模式和模式數(shù)組,并且可以忽略大小寫(xiě),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • C語(yǔ)言實(shí)現(xiàn)搶紅包算法

    C語(yǔ)言實(shí)現(xiàn)搶紅包算法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言搶紅包算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C/C++程序設(shè)計(jì)的基本概念詳解

    C/C++程序設(shè)計(jì)的基本概念詳解

    這篇文章主要介紹了C++程序設(shè)計(jì)的基本概念詳解,文中有非常詳細(xì)的C語(yǔ)言使用教程及相關(guān)基礎(chǔ)知識(shí),對(duì)正在學(xué)習(xí)c語(yǔ)言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • Windows網(wǎng)絡(luò)編程之winsock實(shí)現(xiàn)文件傳輸示例

    Windows網(wǎng)絡(luò)編程之winsock實(shí)現(xiàn)文件傳輸示例

    這篇文章主要介紹了Windows網(wǎng)絡(luò)編程之winsock實(shí)現(xiàn)文件傳輸示例,對(duì)于學(xué)習(xí)Windows網(wǎng)絡(luò)程序設(shè)計(jì)來(lái)說(shuō)具有很好的學(xué)習(xí)借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • QT圓形圖像剪切功能實(shí)現(xiàn)

    QT圓形圖像剪切功能實(shí)現(xiàn)

    這篇文章主要介紹了QT圓形圖像剪切,實(shí)現(xiàn)代碼包括剪切代碼,完整QML源碼,C++代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • C++異步操作future和aysnc與function和bind

    C++異步操作future和aysnc與function和bind

    這篇文章主要介紹了C++異步操作future和aysnc與function和bind,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • C++設(shè)計(jì)模式之命令模式

    C++設(shè)計(jì)模式之命令模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之命令模式,本文講解了什么是命令模式、命令模式的使用場(chǎng)合等內(nèi)容,并給出了一個(gè)代碼實(shí)例,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)堆的基本操作實(shí)現(xiàn)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)堆的基本操作實(shí)現(xiàn)

    這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)堆的基本操作實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • C++ std::make_unique和std::make_shared用法小結(jié)

    C++ std::make_unique和std::make_shared用法小結(jié)

    本文主要介紹了C++ std::make_unique和std::make_shared用法,使用std::make_unique和std::make_shared能夠簡(jiǎn)化動(dòng)態(tài)分配內(nèi)存和構(gòu)造對(duì)象的過(guò)程,提高代碼的安全性和可讀性,感興趣的可以了解一下
    2023-11-11

最新評(píng)論

浦城县| 祁门县| 酉阳| 洛扎县| 莲花县| 会宁县| 上虞市| 筠连县| 信丰县| 平湖市| 博罗县| 湖州市| 通道| 伽师县| 靖远县| 筠连县| 桐乡市| 延长县| 枞阳县| 平果县| 宜兰县| 米易县| 剑川县| 铜山县| 克拉玛依市| 富锦市| 安塞县| 井陉县| 佳木斯市| 罗江县| 大化| 特克斯县| 新泰市| 滨海县| 观塘区| 常山县| 平谷区| 临高县| 原平市| 杨浦区| 灵川县|