2009-08-07 5 views
1

Si j'ai une carte comme celle-ci:C++ carte question

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'); 

Comment puis-je trouver et supprimer 'b'? Est-ce possible?

Répondre

6

Bien sûr, utiliser un itérateur:

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 Bien que je pourrais changer « b » à « B » :) – SwDevMan81

+0

cela me donne une erreur aucun identifiant de trouver introuvable –

+0

La question initiale a deux « B » et « b » et spécifique « b 'comme l'élément à supprimer. Sans plus de détails, je devine surtout. –

1

Si vous prévoyez qu'il peut y avoir plusieurs « b est dans le vecteur, je voulais écrire cette façon.

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

Je ne pense pas que 'std :: remove()' fonctionne sur les cartes, puisque leur valeur_type' est un objet (en partie) 'const' et, IIRC,' std :: remove() 'exige qu'il soit assignable. – sbi

+0

Jack ne veut-il pas supprimer 'b' dans le vecteur? J'appelle std :: remove sur le vecteur (i-> second) et non sur la carte. – Kei

+0

@Kei: Euh, désolé pour ce brainfart. '' – sbi

0

Je suis seulement à reproduire d'autres algorithmes des gens ici, mais je trouve que sans quelques typedefs judicieux et des variables de référence temporaire, les longues lignes supplémentaires peuvent devenir nettement moins lisible.

La question initiale ne spécifie pas entièrement le comportement requis, mais il peut être approprié de supprimer l'entrée de la carte si le vecteur est laissé vide. Cela pourrait être fait dans le cadre de l'itérateur de la carte, ou comme une passe à la fin.

Vous pouvez également supprimer le premier 'b' dans le premier vecteur contenant un 'b', ou tout 'b' dans chaque vecteur, ou une combinaison quelconque.

Supprimez tous les 'b' dans tous les vecteurs de la carte.

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()); 
} 

Supprimez le premier 'b' trouvé dans le vecteur de la carte.

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; 
    } 
} 

Supprimer les entrées de carte vides.

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