2017-02-09 74 views
1

我試圖在條件滿足std::list時刪除列表中的元素。我已閱讀有關erase函數的返回值的參考:從迭代器中刪除std :: list中的條目

的迭代器指向隨後通過函數調用刪除最後一個元素 的元素。如果 操作刪除了序列中的最後一個元素,則這是容器結束。

成員類型迭代器是一種雙向迭代器類型,指向 元素。

我已經把這個例子起來:

#include <string> 
#include <list> 
#include <iostream> 

int main() 
{ 
     typedef std::list<std::string> string_list_t; 
     string_list_t list; 
     list.push_back("test1"); 
     list.push_back("test2"); 
     list.push_back("test3"); 
     list.push_back("test4"); 
     list.push_back("test5"); 
     list.push_back("test6"); 
     list.push_back("test7"); 
     list.push_back("test8"); 

     for (string_list_t::iterator it = list.begin(); it != list.end(); ++it) 
     { 
       std::string &str = *it; 
       std::cout << "Checking " << str << "..." << std::endl; 
       if (str == "test4") 
       { 
         std::cout << "Found test4!" << std::endl; 
       } 
       else 
       { 
         it = list.erase(it); 
       } 
     } 


    return 0; 
} 

它不給我預期的輸出,而不是它給了我:

Checking test1... 
Checking test3... 
Checking test5... 
Checking test7... 

有人可以幫助我找出我的理解錯誤?它以某種方式跳過每個第二個元素...

回答

4

您正在跳過刪除的元素後面的元素。

您應該使用或者it = list.erase(it);++it,但不是兩者。

+1

gnaaaaah宕它。謝謝! – Nidhoegger

2

當您從std::list中刪除元素時,請不要遞增std::list::erase方法返回的迭代器。你不會跳過下一個元素,你可能會最終增加一個迭代器end()

你的循環更改爲:

for (string_list_t::iterator it = list.begin(); it != list.end();) 
                   //^^ Not incremented 
     { 
       std::string &str = *it; 
       std::cout << "Checking " << str << "..." << std::endl; 
       if (str == "test4") 
       { 
         std::cout << "Found test4!" << std::endl; 
         ++it;   //increment 
       } 
       else 
       { 
         it = list.erase(it); 
       } 
     } 

看到它Live Here