2017-02-09 22 views
1

std::listで条件が満たされたときにリスト内の要素を削除しようとしています。イテレータ中にstd :: listからエントリを削除します

関数呼び出しによって消去最後の要素 を追った要素を指すイテレータを:私は何erase関数の戻り値について参考に読みました。 操作でシーケンスの最後の要素が消去された場合は、コンテナの最後です。

メンバー型iteratorは、 要素を指す双方向イテレータ型です。

私は一緒にこの例を入れている:

#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... 

誰かが私が理解し何を考え出す助けることができます違う?何とか2番目の要素をスキップします...

答えて

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

関連する問題