" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C/C++迭代器的失效問題詳解

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

前言

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

下面是我今天做的一些代碼測試:

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;
 }

當我運行起來時發(fā)現(xiàn)有越界訪問和結果不符合預期這兩種情況。

我們接著往下看下一個出問題的測試代碼:

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;
}

當該程序運行起來我發(fā)現(xiàn)出現(xiàn)了越界問題!

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

迭代器失效

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

1.迭代器的意義變了

2.迭代器完全失效

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

那么,這種問題有什么較好的解決方案呢?其實很簡單我們每次進行操作的時候都要更新下迭代器坐標即可

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)) 
		{
            //由于刪除導致迭代器失效,所以我們重新更新下迭代器即可
			it = v.erase(it);
 		}
		else
        {
            //當?shù)鞑皇桥紨?shù)是才移動,如果所有情況都迭代的話會導致迭代器失效
			++it; 
        }
	}

	return 0;
 }

情況2是指迭代器完全不能用了,如果還堅持使用會發(fā)生越界訪問,因為此時的迭代器已經是一個野指針了迭代器的底層都是一個指針來維護的,當?shù)魍耆б馕吨摰鞒蔀榱艘爸羔槨?/p>

Test2 是想修改指定位置的值,但是在修改前發(fā)生了一次擴容而該擴容就是導致迭代器失效的罪魁禍首,因為發(fā)生擴容的話原來的空間會被丟棄重新開辟一段內存來使用,而迭代器的底層是一個指針,它還指向之前的內存而該內存因為被釋放了所以我們沒有了使用權此時的迭代器也就成為了野指針。

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

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);
  	//擴容導致迭代器成為野指針
   	v.reserve(100);
   	//這時如果還想更改指定位置的值,那么我們需要進行一個迭代器的更新
  	pos =find(v.begin(), v.end(), 3);
    *pos = 30;
 	return 0;
}

總結

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

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!    

相關文章

  • C++11中的原子量和內存序詳解

    C++11中的原子量和內存序詳解

    這篇文章主要給大家介紹了關于C++11中原子量和內存序的相關資料,文中通過示例代碼介紹地方非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • 利用C語言實現(xiàn)三子棋(井字棋)小游戲

    利用C語言實現(xiàn)三子棋(井字棋)小游戲

    這篇文章主要為大家詳細介紹了利用C語言實現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++設計模式之備忘錄模式

    C++設計模式之備忘錄模式

    這篇文章主要介紹了C++設計模式之備忘錄模式,本文講解了什么是備忘錄模式、備忘錄模式的UML類圖、備忘錄模式的使用場合等內容,需要的朋友可以參考下
    2014-10-10
  • 淺談c++構造函數(shù)問題,初始化和賦值問題

    淺談c++構造函數(shù)問題,初始化和賦值問題

    下面小編就為大家?guī)硪黄獪\談c++構造函數(shù)問題,初始化和賦值問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++中產生臨時對象的情況及其解決方案

    C++中產生臨時對象的情況及其解決方案

    這篇文章主要介紹了C++中產生臨時對象的情況及其解決方案,以值傳遞的方式給函數(shù)傳參,類型轉換以及函數(shù)需要返回對象時,并給對應給出了詳細的解決方案,通過圖文結合的方式講解的非常詳細,需要的朋友可以參考下
    2024-05-05
  • C++實現(xiàn)PatchMatch圖像修復算法

    C++實現(xiàn)PatchMatch圖像修復算法

    這篇文章主要介紹了C++實現(xiàn)PatchMatch圖像修復算法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 詳解C語言初階基礎

    詳解C語言初階基礎

    這篇文章主要介紹了C語言中的初階基礎,介紹了其相關概念,具有一定參考價值。需要的朋友可以了解下,希望能夠給你帶來幫助
    2021-11-11
  • C++基于CMD命令行實現(xiàn)掃雷小游戲

    C++基于CMD命令行實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細介紹了C++基于CMD命令行實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言入門篇--初識C語言及數(shù)據(jù)類型

    C語言入門篇--初識C語言及數(shù)據(jù)類型

    本篇文章是c語言基礎篇,主要為大家介紹了C語言的基本類型,為大家介紹了什么是C語言,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • OpenCV實現(xiàn)多圖像拼接成一張大圖

    OpenCV實現(xiàn)多圖像拼接成一張大圖

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)多圖像拼接成一張大圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論