STL容器刪除元素的陷阱

2021-09-06 18:46:37 字數 932 閱讀 1639

今天看scott meyers大師的stl的用法,看到了我前段時間犯的乙個錯誤,發現我寫的**和他提到錯誤**幾乎一模一樣,有關stl容器刪除元素的問題,錯誤的**如下:

std::vectormfriendlist;

...std::vector::iterator iter = mfriendlist.begin();

for ( ; iter != mfriendlist.end(); ++iter)

記得當時once給我說過這個問題,還給我改過**,我當時不明白為什麼,只知道程式執行的時候如果if為true那麼程式就肯定會崩潰。

大師的說法是:當容易中的乙個元素被刪除時,指向該元素的所有迭代器都變得無效。上面的**中,只要執行了erase(iter),那麼iter就會變得無效,那麼執行++iter就肯定會出錯。

在網上看到有人總結如下兩條:

1. 對於節點式容器(map, list, set)元素的刪除,插入操作會導致指向該元素的迭代器失效,其他元素迭代器不受影響

2. 對於順序式容器(vector,string,deque)元素的刪除、插入操作會導致指向該元素以及後面的元素的迭代器失效

總結了一下,並回想once當時給我改的**,所以正確的寫法應該是這樣的:

1.對於節點式容器

std::listmlist;

...std::list::iterator iter = mlist.begin();

for ( ; iter != mlist.end(); )

else

}2.對於順序式容器

std::vectormvector;

...std::vector::iterator iter = mvector.begin();

for ( ; iter != mvector.end(); )

else

}

STL 迴圈刪除容器中元素的方法和陷阱

演算法大師donald knuth 不成熟的優化是一切惡果的根源 permature optimization is the root of all evil stl中的容器主要是兩種 序列式容器和關聯式容器。下面講到的都是我在開發中曾經遇到過的一些問題,有些例子我做了修改,我想初學stl的人基本都...

安全刪除STL容器元素

stl容器迭代過程中刪除元素技巧 序列容器的erase方法返回值是指向緊接在被刪除元素之後的元素的有效迭代器,可以根據這個返回值來安全刪除元素。vectorc for vector iterator it c.begin it c.end 關聯容器的 erase 方法沒有返回值,被刪除的迭代器失效,...

STL序列式容器中刪除元素的方法和陷阱(二)

2.使用stl中通用演算法或容器成員函式刪除元素的方法 以上手工編寫for迴圈 刪除容器中元素的方法也有一些問題,如果判斷條件特別複雜,又有迴圈判斷的話,迴圈中間又有異常處理的話,itvect的位置就要小心放置了,稍不留意就要出錯。所以手工編寫 刪除容器中元素的方法不太安全,重複,也不夠優雅,要注意...