昨天**面試碰到一道面試題,對於map
mapma
p容器找到特定的value的元素並刪除它,當第一次刪除之後迭代器ite
rato
riterator
iterat
or可能會失效,如何讓迭代可以繼續下去。下面看具體的例子:
int
main()
for(map<
int, string>
::iterator itr = erasetest.
begin()
; itr != erasetest.
end();
++itr)
}
這時會出現如圖1所示的報錯。這是因為刪除操作之後原有的迭代器(也就是乙個類物件)會失效,之後就無法繼續進行遞增的操作。所以會出現錯誤。
我們可以對以上**做小小的修改,就可以避免錯誤。通過這位兄台的部落格了解到迭代器的後++操作會保留原迭代器的乙個臨時變數並返回並對原迭代器進行加一操作。因此下面在執行刪除操作之前會產生原迭代器的乙個臨時變數並返回作為era
seerase
eras
e函式的引數,執行完era
seerase
eras
e函式後該臨時變數就失效了,但是原迭代器還是執行了加一操作也沒有失效因此可以繼續執行。因為map
mapma
p容器的內部實現是類似平衡二叉樹的紅黑樹(有待查詢資料)。因此刪除操作不會改變元素在記憶體中的具體位置只是改變元素見的指標的指向關係。所以這樣的操作是ok的。如圖2所示。
)}對於以上的改進**還有乙個小問題,如果要刪除的元素剛好是緊挨著迭代器指標era
sete
st.e
nd()
erasetest.end()
eraset
est.
end(
)的迭代器指標指向的元素,則在刪除該元素後會有兩次後++操作,一次是語句era
sete
st.e
rase
(itr
++);
erasetest.erase(itr++);
eraset
est.
eras
e(it
r++)
;裡面的,另一次是語句for
(map
t,st
ring
>::
iter
ator
itr=
eras
etes
t.be
gin(
);it
r!=e
rase
test
.end
();i
tr++
)for (map::iterator itr = erasetest.begin(); itr != erasetest.end(); itr++)
for(ma
pt,st
ring
>::
iter
ator
itr=
eras
etes
t.be
gin(
);it
r!=e
rase
test
.end
();i
tr++
)裡面的。這裡會出現報錯。如圖3所示。
}在以上的例子中關鍵字23對應的串bab
ybaby
baby
剛好是緊挨著迭代器指標era
sete
st.e
nd()
erasetest.end()
eraset
est.
end(
)的迭代器指標指向的元素,因此在刪除它後會出現如圖3的錯誤。為了避免以上的問題我們只需要加乙個簡單地的判斷就可以了。
c map 迭代器刪除示例
c stl中的map是非常常見的。通常我們用如下方式來遍歷,並且刪除map中的一些entry map mp mp.insert make pair 1,1 mp.insert make pair 2,3 insert some elements for map iterator iter mp.be...
C 中容器迭代器刪除失效問題
c 迭代器失效問題 map set等關聯容器如何刪除元素 vector list deque等序列容器如何刪除元素 迭代器如何使用 序列性容器 vector和list和deque erase迭代器不僅使所指向被刪元素的迭代器失效,而且使被刪元素之後的所有迭代器失效,所以不能使用erase iter ...
迭代器的刪除問題
it m ballactionsmgr.begin for it m ballactionsmgr.end it 這樣刪除是正確的 it m ballactionsmgr.begin for it m ballactionsmgr.end it 這樣刪除有問題,刪除迭代器以後,迭代器又加了1,所以刪...