日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL容器删除元素的陷阱

發(fā)布時間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL容器删除元素的陷阱 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天看Scott Meyers大師的stl的用法,看到了我前段時間犯的一個錯誤,發(fā)現(xiàn)我寫的代碼和他提到錯誤代碼幾乎一模一樣,有關(guān)stl容器刪除元素的問題,錯誤的代碼如下:
std::vector<struct> mFriendList;
...
std::vector<struct>::iterator iter = mFriendList.begin();
for ( ; iter != mFriendList.end(); ++iter)
{
??? if (...)
??????? mFriendList.erase(iter);
}
記得當時Once給我說過這個問題,還給我改過代碼,我當時不明白為什么,只知道程序執(zhí)行的時候如果if為true那么程序就肯定會崩潰。
大師的說法是:當容易中的一個元素被刪除時,指向該元素的所有迭代器都變得無效。上面的代碼中,只要執(zhí)行了erase(iter),那么iter就會變得無效,那么執(zhí)行++iter就肯定會出錯。

在網(wǎng)上看到有人總結(jié)如下兩條:
1. 對于節(jié)點式容器(map, list, set)元素的刪除,插入操作會導(dǎo)致指向該元素的迭代器失效,其他元素迭代器不受影響
2. 對于順序式容器(vector,string,deque)元素的刪除、插入操作會導(dǎo)致指向該元素以及后面的元素的迭代器失效

總結(jié)了一下,并回想Once當時給我改的代碼,所以正確的寫法應(yīng)該是這樣的:
1.對于節(jié)點式容器
std::list<struct> mList;
...
std::list<struct>::iterator iter = mList.begin();
for ( ; iter != mList.end(); )
{
??? if (...)
??? {
??????? //因為節(jié)點式只會導(dǎo)致當前節(jié)點迭代器失效,所以刪除節(jié)點的同時對迭代器進行后移的操作,因為其他元素不會失效
??????? mList.erase(iter++);
??? }
??? else
??? {
??????? ++iter;
??? }
}

2.對于順序式容器
std::vector<struct> mVector;
...
std::vector<struct>::iterator iter = mVector.begin();
for ( ; iter != mVector.end(); )
{
??? if (...)
??? {
??????? //這里就比較有說法了,因為順序式容器會使本身和后面的元素迭代器都失效,所以不能簡單的++操作
??????? //這里順序式容器的erase()會返回緊隨被刪除元素的下一個元素的有效迭代器
??????? //而節(jié)點式容器的erase()的返回值是void,這點我感覺太神奇了,確實太神奇了!!!!
??????? iter = mVector.erase(iter);
??? }
??? else
??? {
??????? ++iter;
??? }
}

注意:容器看具體STL庫的實現(xiàn)了,VS中兩類容器的earse都返回下一個迭代器指針。

總結(jié)

以上是生活随笔為你收集整理的STL容器删除元素的陷阱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。