2016-04-24 84 views
0

非常簡單:我有以下代碼和方法erase不起作用。我看不出有什麼問題,有,因爲如果我去http://www.cplusplus.com/reference/list/list/erase/,語法爲:iterator erase (iterator position);C++從對列表中刪除

list<pair<string,int>> l0 { { "name1", 20 }, { "name2", 30 }, { "name3", 40 } }; 
for(auto &it : l0) 
    l0 . erase(it); 

,願你有一個問題,即存在的pair<string,int>一個list,而不是基本數據類型的list

編輯:問題是代碼是不可編譯的。

+0

提示:'它由於'erase()'而改變。 –

+0

除了擦除迭代器位置使該迭代器(或所有迭代器)無效外,代碼不應該編譯。 –

+0

@DieterLücking確切地說,它不會編譯。順便說一下,第一條評論並沒有幫助我。你能給我另一個提示嗎? – scarface

回答

1

range-for遍歷一個容器通過給您訪問 元件在容器中,而不是一個迭代的元素。

所以在for(auto &it : l0),it不是一對迭代器,而是 對一個對的引用。這就是爲什麼你的代碼不能編譯

這就是說,作爲πάνταῥεῖ指出,當他最初是關閉這個作爲 Keeping a valid vector::iterator after erase()重複的,即使你的代碼將 編譯它不會因爲無效的工作刪除之後的迭代器:

迭代器,指向由函數移除的元素的指針和引用將失效。 所有其他迭代器,指針和引用保持其有效性。

解決方法

您不得使用範圍,對,但傳統for,以及使用的erase()返回值迭代:

for (auto it=l0.begin(); it!=l0.end();) 
    it = l0.erase(it); // to avoid incrementing an invalidated iterator 

Live demo

+0

這個答案是錯誤的。只有每一個元素都會被擦除(也可能會被識別出來)。 –

+0

@DieterLücking你能否詳細說明一下?因爲現場演示顯示的東西似乎完美地工作(erase()的返回值是「*指向元素的迭代器,該元素跟隨函數調用擦除的最後一個元素。這是容器結束,如果操作刪除了最後一個元素元素在序列中。*「。 – Christophe