2009-08-07 13 views
1

私はこのようなマップがある場合:私は見つけると「B」を削除する方法をC++マップの質問

std::map<char, std::vector<char> > m; 
m['A'].push_back('a'); 
m['A'].push_back('b'); 
m['A'].push_back('c'); 
m['B'].push_back('h'); 
m['B'].push_back('f'); 

を?これは可能ですか?

答えて

6

確かに、イテレータを使用します。

for (std::map<char, std::vector<char> >::iterator i = m.begin(); i != m.end(); ++i) { 
    std::vector<char>::iterator j = std::find(i->second.begin(), i->second.end(), 'b'); 
    if (j != i->second.end()) { 
     i->second.erase(j); 
    } 
} 
+0

+1私は「B」:) – SwDevMan81

+0

に「b」を変更する場合がありますが、これは私に何の検索識別子が –

+0

見つからないないエラーを与える元の質問「B」と「B」、および特定の「bの両方を持っています'を削除する項目として選択します。詳細がなければ、私はほとんど推測しています。 –

1

あなたはベクトルに複数の「Bさんがあることができ期待していた場合、私はこの方法を記述します。

for (std::map<char, std::vector<char> >::iterator i = m.begin(); i != m.end(); ++i) { 
    i->second.erase(std::remove(i->second.begin(), i->second.end(), 'b'), i->second.end()); 
} 
+0

'value_type'は(部分的に)' const'オブジェクトであり、IIRC、 'std :: remove()'はそれを割り当てる必要があるため、 'std :: remove()'はマップ上で動作しないと思います。 – sbi

+0

ジャックはベクトルの 'b'を削除しようとしていませんか?私はマップではなくベクトル(i-> second)でstd :: removeを呼び出しています。 – Kei

+0

@Kei:ええ、そのbrainfartに申し訳ありません。 '' – sbi

0

私はここでしか他の人のアルゴリズムを再現するんだけど、私は賢明なのtypedefと、一時的な参照変数のカップルずに余分な長い行が大幅に読みにくくなることができますを見つけます。

元の質問では必要な動作を完全には指定していませんが、ベクターが空のままになっている場合はマップエントリを削除することが適切な場合があります。これはマップイテレータの一部として、または最後のパスとして行うことができます。

「b」を含む最初のベクトル、またはすべてのベクトルのすべての「b」、または何らかの組み合わせを削除することもできます。

マップ内のすべてのベクトルのすべての「b」を削除します。

typedef std::map<char, std::vector<char> > MapVecChar; 

for(MapVecChar::iterator i = m.begin(); i != m.end(); ++i) 
{ 
    std::vector<char> &v = i->second; 
    v.erase(std::remove(v.begin(), v.end(), 'b'), v.end()); 
} 

マップ内のベクターにある最初の「b」を削除します。

typedef std::map<char, std::vector<char> > MapVecChar; 

for(MapVecChar::iterator i = m.begin(); i != m.end(); ++i) 
{ 
    std::vector<char> &v = i->second; 

    std::vector<char>::iterator j(std::find(v.begin(), v.end(), 'b')); 

    if(j != v.end()) 
    { 
     v.erase(j); 
     break; 
    } 
} 

空のマップエントリを削除します。

for(MapVecChar::iterator i = m.begin(); i != m.end();) 
{ 
    if(i->second.empty()) 
     m.erase(i++); 
    else 
     ++i; 
}