STL迭代器異常 map,set的erase()和insert()操作

我們都知道在STL中有迭代器,但是erase()和insert()操作會使迭代器異常

erase()會刪除迭代器

例如:

set<int>st;
set<int>::iterator it = st.begin()
for(it;it!=st.end();it++)
{
    erase(*it);
}

我們通常會這樣來刪除set中的元素,但是這樣刪除的話,會把迭代器一起刪除,而不僅僅刪除了元素。

 

我們在刪除元素的時候,要返回迭代器,因爲迭代器會自動指向下一個位置

set<int>st;
set<int>::iterator it = st.begin()
for(it;it!=st.end();it++)
{
    it = it.erase(*it);
    
    //it.erase(it++);  第二種方法
}

這樣就可以了,map同理

解釋一下第二種方法:在刪除迭代器時候執行it++

原理解析:

// postfix form: fetch and increment
map<int, int>::iterator operator++(int)//通過一個多餘的int參數與prefix++區分
{
    map<int, int>::iterator tmp = *this; // fetch
    increment(); // increment,map內部由紅黑樹實現,此函數負責指向下一個有序元素的iterator
    return tmp; // return what was
}

首先會存儲當前的位置,然後increment()把this移到了下一個位置,但是返回的tmp是舊的*this

然後參數調用優先級高於函數調用。相當於多了一箇中間變量tmp。

這是++it的源碼:

// prefix form: increment and fetch
map<int, int>::iterator& operator++()
{
    increment(); // increment
    return *this; // fetch
}

少了一箇中間變量的賦值,所以++it比it++的效率更高一些

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章