我們都知道在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++的效率更高一些