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

C++中vector迭代器失效問題的原因及解決方案

 更新時(shí)間:2024年09月05日 10:01:14   作者:夜晚中的人海  
迭代器(iterator)是一種用于遍歷數(shù)據(jù)集合的的對(duì)象,它提供了一種訪問數(shù)據(jù)集合中元素的方式,而無需暴露數(shù)據(jù)集合內(nèi)部的細(xì)節(jié),使用迭代器,我們可以對(duì)數(shù)據(jù)集合中的每個(gè)元素進(jìn)行處理,本文介紹了C++中關(guān)于vector迭代器失效問題的原因及解決方案,需要的朋友可以參考下

一、迭代器失效是什么

在進(jìn)入此問題時(shí),我們首先要了解迭代器的本質(zhì)其實(shí)是指針,迭代器的失效就相當(dāng)于指針失效的問題。而指針失效就說明指針指向的空間是非法的,變成為了野指針。

空間非法: 就是指指針指向了已經(jīng)被釋放的空間或者越界訪問,

我們可以用代碼的方式來解釋此問題。

#include<iostream>
#include<vector>
using namespace std;
void test()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	auto it = v.begin();
	v.push_back(5);
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

通過上述代碼,當(dāng)我們運(yùn)行程序時(shí)會(huì)發(fā)生報(bào)錯(cuò)。其原因就是因?yàn)榈魇У膯栴}。我們可以分析一下其中的過程。

過程:it一開始指向初始空間的元素,而再次進(jìn)行尾插操作時(shí),由于空間不夠需要擴(kuò)容,因此需要釋放舊空間開辟新空間,但此時(shí)的it還是指向已經(jīng)被釋放的舊空間,已經(jīng)成為野指針了,因此再循環(huán)當(dāng)中對(duì)野指針進(jìn)行解引用是就會(huì)導(dǎo)致程序崩潰。

二、vector中哪些操作會(huì)導(dǎo)致迭代器失效

在所有可能對(duì)空間進(jìn)行擴(kuò)容操作的都有可能導(dǎo)致迭代器失效,如:push_back、resize、insert、reserve等。

需要注意的是:有一個(gè)特殊的操作,編譯器也會(huì)認(rèn)為迭代器失效,就是erase操作。
我們要知道,erase函數(shù)的返回值是返回被刪除元素的后一個(gè)位置,當(dāng)刪除完元素時(shí),當(dāng)前位置之后的元素都會(huì)往前進(jìn)行偏移,但這并沒有導(dǎo)致空間的改變,理論上這是不是并沒有導(dǎo)致迭代器失效呢?

那么如果當(dāng)前位置的元素剛好就是最后一個(gè)元素時(shí),當(dāng)對(duì)其進(jìn)行刪除時(shí),返回的位置則指向end(),而end()的位置并沒有元素,那么當(dāng)對(duì)其進(jìn)行解引用時(shí)也會(huì)導(dǎo)致程序崩潰,因此編譯器認(rèn)為這樣的操作并不安全,于是認(rèn)為當(dāng)刪除完元素時(shí),迭代器就應(yīng)該按失效的方式處理,不再對(duì)其進(jìn)行使用。

#include<iostream>
#include<vector>
using namespace std;
void test()
{
	vector<int> v{1,2,3,4,5,6};
	auto it = v.begin();
	//刪除偶數(shù)
	while (it != v.end())
	{
		if (*it % 2 == 0)
		{
			v.erase(it);
		}
		else
		{
			it++;
		}
	}
}

三、如何避免迭代器失效的問題

通過以上敘述,我們了解了有關(guān)迭代器失效的產(chǎn)生及問題,那么我們?cè)撊绾伪苊獯藛栴}發(fā)生呢?
其實(shí)解決辦法也挺簡單的:只需當(dāng)我們使用了有可能對(duì)迭代器失效的操作時(shí),如果想再次使用迭代器時(shí),只需在使用前令其指向新空間。

我們可以用一段代碼來演示過程:

舉例:使用push_back函數(shù)

#include<iostream>
#include<vector>
using namespace std;
void test()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	auto it = v.begin();
	v.push_back(5);
	it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

通過上述代碼,當(dāng)我們要再次進(jìn)行尾插操作時(shí),只需改變一下it指向新空間的位置即可,這樣就不會(huì)導(dǎo)致迭代器產(chǎn)生失效的問題了。

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

相關(guān)文章

  • 解析C++編程中的#include和條件編譯

    解析C++編程中的#include和條件編譯

    這篇文章主要介紹了解析C++編程中的#include和條件編譯,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • c語言中比較特殊的輸入函數(shù)舉例詳解

    c語言中比較特殊的輸入函數(shù)舉例詳解

    C語言提供了豐富的標(biāo)準(zhǔn)庫函數(shù),用于處理各種輸入輸出操作,下面這篇文章主要介紹了c語言中比較特殊的輸入函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • C++中獲取隨機(jī)數(shù)的常用方法小結(jié)

    C++中獲取隨機(jī)數(shù)的常用方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了C++中獲取隨機(jī)數(shù)的幾種常用方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2025-01-01
  • C語言詳解判斷相同樹案例分析

    C語言詳解判斷相同樹案例分析

    這篇文章主要介紹了用C語言檢查兩棵樹是否相同,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2022-04-04
  • C++中的操作符重載詳細(xì)解析

    C++中的操作符重載詳細(xì)解析

    運(yùn)算符重載后不能改變運(yùn)算符的操作對(duì)象(操作數(shù))的個(gè)數(shù);如:"+"是實(shí)現(xiàn)兩個(gè)操作數(shù)的運(yùn)算符,重載后仍然為雙目運(yùn)算符
    2013-09-09
  • C++實(shí)現(xiàn)文件逐行讀取與字符匹配的示例詳解

    C++實(shí)現(xiàn)文件逐行讀取與字符匹配的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何溧陽C++實(shí)現(xiàn)文件逐行讀取與字符匹配的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-03-03
  • Qt 實(shí)現(xiàn)鋼筆畫線效果示例及詳細(xì)原理

    Qt 實(shí)現(xiàn)鋼筆畫線效果示例及詳細(xì)原理

    這篇文章主要介紹了Qt 實(shí)現(xiàn)鋼筆畫線效果示例及詳細(xì)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過問題及解決

    C語言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過問題及解決

    這篇文章主要介紹了C語言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • vc獲取計(jì)算機(jī)名和ip地址的方法

    vc獲取計(jì)算機(jī)名和ip地址的方法

    這篇文章主要介紹了vc獲取計(jì)算機(jī)名和ip地址的方法,涉及通過VC對(duì)系統(tǒng)相關(guān)信息操作技巧,需要的朋友可以參考下
    2015-05-05
  • C++實(shí)現(xiàn)比特幣系統(tǒng)的源碼

    C++實(shí)現(xiàn)比特幣系統(tǒng)的源碼

    這篇文章主要介紹了C++實(shí)現(xiàn)比特幣系統(tǒng)的源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01

最新評(píng)論

淮北市| 卓尼县| 吐鲁番市| 修武县| 偏关县| 永新县| 施甸县| 乐安县| 张家川| 永州市| 鹿泉市| 金湖县| 兰西县| 丰城市| 泰顺县| 宁乡县| 吴旗县| 南安市| 乐业县| 皮山县| 安徽省| 威海市| 寿阳县| 商河县| 巫山县| 南靖县| 清河县| 靖宇县| 日喀则市| 白朗县| 英吉沙县| 巫山县| 鄂托克前旗| 安徽省| 宣威市| 溧阳市| 遵义市| 东方市| 湘潭市| 河北省| 老河口市|