2016-11-16 11 views
0

私はベクトルのマップをC++で持っています。各ベクトルについて、私はある条件を満たすエントリーを削除したいと思う。ベクトルが空になったら、マップから削除したいと思います。私は、削除がイテレータを混乱させる可能性があることを知っています、そして、二重反復はこれを私にとってさらに混乱させます。これを達成する最良の方法は何ですか?削除中にベクトルのマップを反復処理する方法はありますか?

+0

少しコードのためのものです文脈はここで助けになるだろう。 – tadman

+0

一般的に言えば、あなたの試行を見せてもらうのは良いことです。あなたのコードの一部を含めずに質問を投稿するのはまれです。 –

+4

これはhttp://stackoverflow.com/questions/8234779/how-to-remove-from-a-map-while-iterating-itの複製です – qexyn

答えて

4

標準変異コンテナループ:ここ

for (auto it = m.begin(); it != m.end();) 
{ 
    // work 

    if (/* need to delete */) // e.g "if (it->second.empty())" 
    { 
     it = m.erase(it); 
    } 
    else 
    { 
     ++it; 
    } 
} 
0

は、それを行うことができる方法を示して実証プログラムで

#include <iostream> 
#include <map> 
#include <vector> 

int main() 
{ 
    std::map<int, std::vector<int>> m = 
    { 
     { 1, { 1, 2 } }, 
     { 2, { 2 } }, 
     { 3, { 3, 4 } }, 
     { 4, { 4 } } 
    }; 

    for (const auto &p : m) 
    { 
     std::cout << p.first << ": "; 
     for (int x : p.second) std::cout << x << ' '; 
     std::cout << std::endl; 
    } 

    for (auto it = m.begin(); it != m.end();) 
    { 
     it->second.erase(it->second.begin()); 

     if (it->second.empty()) it = m.erase(it); 
     else ++it; 
    } 

    std::cout << std::endl; 

    for (const auto &p : m) 
    { 
     std::cout << p.first << ": "; 
     for (int x : p.second) std::cout << x << ' '; 
     std::cout << std::endl; 
    } 

    return 0; 
} 

プログラム出力は

1: 1 2 
2: 2 
3: 3 4 
4: 4 

1: 2 
3: 4 
関連する問題