在這個代碼摘錄請看:遍歷一棵樹,同時取出並重新插入的元素
while(*it <= *it_end and it != myset.end())
if(foo(*it++))
return true;
it
和it_end
是的std ::設置(的RB樹)的有效迭代器。
foo
要麼:
- 刪除
it
,並與*it
相同的值再次插入一個元素,returing假; - 刪除
it
並返回true。
我的問題:
它是安全運行這個循環?
在調用foo
之前,it
將成爲樹的下一個元素的有效迭代器,但是恐怕std :: set中的某些內部魔法使該迭代器無效,就像RB的自平衡算法樹。
很有趣的是你的答案是如何嚴格錯誤的,因爲你的ARE混淆了後期和前期增量之間的差異。在調用'foo'之前''它會增加。然而,你粘貼的摘錄確實回答了這個問題,即「是的,它是安全的」。我認爲我應該接受你的答案,並且也會讓它失望,呵呵。 – Kira
@Kira - 是的,我的第一個答案是錯的。不是由於前/後增量的混淆,而是由於在執行foo之前或之後是否執行了增量的混淆。答案已更新。 – 4386427