2015-04-22 111 views
0

這與Can you remove elements from a std::list while iterating through it?不相似。我的是一個不同的場景。迭代時從stl列表中刪除多個元素

可以說我有這樣的列表。

1 2 3 1 2 2 1 3 

我想在這樣的方式 當我第一次遇到一個元素X我做一些活動,然後我需要刪除所有的元素X在該列表中,並繼續迭代來遍歷這個STL列表。什麼是在C++中這樣做的有效方法。

我很擔心,當我做一個刪除或擦除我會無效的迭代器。如果它只有一個元素,那麼我可能會增加迭代器然後擦除。但在我的情況下,我需要刪除/刪除所有的發生。

當時想這樣的

while (!list.empty()) { 
    int num = list.front(); 
    // Do some activity and if successfull 
    list.remove(num); 
    } 

不知道這是否是最好的。

+0

@dwcanillas這可以使未知的迭代器集失效。 – PSIAlt

+0

@PSIA不好意思,我以爲我們在談論矢量,而不是列表。 – dwcanillas

+0

是否需要在迭代時刪除或者可以在迭代之前修改列表?在後一種情況下,可以使用'list :: unique'來僅保留基本上所需的唯一元素。 – lmNt

回答

-1

保存一組看到的數字,如果您遇到集合中的數字,則忽略它。你可以做如下:

list<int> old_list = {1, 2, 3, 1, 2, 2, 1, 3}; 
list<int> new_list; 
set<int> seen_elements; 
for(int el : old_list) { 
    if (seen_elements.find(el) == seen_elements.end()) { 
    seen_elements.insert(el); 
    new_list.push_back(el); 
    } 
} 
return new_list; 

這將處理每一個值僅一次,new_list將只包含在old_list每個元素的第一個副本。這在O(n * log(n))中運行,因爲每次迭代執行一次設置查找(您可以通過使用一個hashset來設置這個O(n))。這比你的方法運行的O(n^2)好得多。