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

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

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

一、迭代器失效是什么

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

空間非法: 就是指指針指向了已經(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;
}

通過上述代碼,當我們運行程序時會發(fā)生報錯。其原因就是因為迭代器失效的問題。我們可以分析一下其中的過程。

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

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

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

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

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

#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)生及問題,那么我們該如何避免此問題發(fā)生呢?
其實解決辦法也挺簡單的:只需當我們使用了有可能對迭代器失效的操作時,如果想再次使用迭代器時,只需在使用前令其指向新空間。

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

舉例:使用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;
}

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

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

相關(guān)文章

  • 基于C程序啟動代碼的深入分析

    基于C程序啟動代碼的深入分析

    本篇文章是對C程序啟動的代碼進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 利用c++和easyx圖形庫做一個低配版掃雷游戲

    利用c++和easyx圖形庫做一個低配版掃雷游戲

    這篇文章主要介紹了用c++和easyx圖形庫做一個低配版掃雷游戲,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • C語言之初始if語句詳解

    C語言之初始if語句詳解

    本文主要介紹C語言中的if語句,這里詳細介紹了if 語句并提供了簡單的示例代碼,希望能幫助編程入門的小伙伴學(xué)習(xí),希望能夠給你帶來幫助
    2021-08-08
  • Qt自定義控件實現(xiàn)線條型加載條

    Qt自定義控件實現(xiàn)線條型加載條

    這篇文章主要為大家詳細介紹了Qt自定義控件實現(xiàn)線條型加載條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 詳解C++之函數(shù)重載

    詳解C++之函數(shù)重載

    這篇文章主要介紹了c++函數(shù)重載的相關(guān)知識,文章講解的非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 詳解C語言之動態(tài)內(nèi)存管理

    詳解C語言之動態(tài)內(nèi)存管理

    本文主要介紹了C語言動態(tài)內(nèi)存管理的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c++ 完備的運行時類型信息(動態(tài)類型信息)

    c++ 完備的運行時類型信息(動態(tài)類型信息)

    這篇文章主要介紹了c++ 完備的運行時類型信息,需要的朋友可以參考下
    2017-07-07
  • C語言double和float 實例分析

    C語言double和float 實例分析

    本文主要介紹了C語言中的浮點數(shù)(float,double),并通過實例代碼進行分析比較,希望能幫助學(xué)習(xí)相關(guān)知識的同學(xué)
    2016-07-07
  • 編輯器寫C語言輸出中文亂碼問題及解決

    編輯器寫C語言輸出中文亂碼問題及解決

    這篇文章主要介紹了編輯器寫C語言輸出中文亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • C語言fillpoly函數(shù)詳解

    C語言fillpoly函數(shù)詳解

    在C語言中,fillpoly函數(shù)的功能是畫一個多邊形,并且把多邊形填充。填充邊框所定義的多邊形的內(nèi)部。fillpoly 函數(shù)的用法:void far fillpoly(int numpoints, int far *polypoints);。
    2015-10-10

最新評論