C++中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++ 完備的運(yùn)行時(shí)類型信息(動(dòng)態(tài)類型信息)
這篇文章主要介紹了c++ 完備的運(yùn)行時(shí)類型信息,需要的朋友可以參考下2017-07-07

