2016-11-15 2 views
-1

J'essaie de découper les espaces blancs du début et de la fin des chaînes de ma carte.Pourquoi mes valeurs std :: map ne sont-elles pas modifiées?

Le code échoue 3 des essais:

#include <map> 
#include <string> 

void blanksOut(std::map<int, std::string> & data) 
{ 
    for (auto p : data) { 
     std::string p1 = p.second; 

     size_t first = p1.find_first_not_of(' '); 
     p1 = p1.erase(0, first); 
     size_t last = p1.find_last_not_of(' '); 
     p1.resize(last + 1); 
     p.second = p1; 
    } 
} 

int main() 
{ 
    std::map<int, std::string> m; 
    m[2] = "foo"; 
    m[3] = " bar"; 
    m[5] = " baz "; 
    m[8] = "quux "; 

    blanksOut(m); 

    return(m[2] != "foo") 
     + (m[3] != "bar") 
     + (m[5] != "baz") 
     + (m[8] != "quux"); 
} 

Le seul qui passe est le premier, où aucun changement est nécessaire. Qu'est-ce que je fais mal?

+0

Veuillez [modifier] votre question pour fournir un [mcve] et un * énoncé de problème clair *. –

+0

J'ai répondu par erreur que 'chaîne p1 = p.second;' devrait être 'chaîne & p1 = p.second;' parce que je n'ai pas pu voir l'instruction 'p.second = p1;' Cependant, l'utilisation d'une référence semble toujours plus appropriée (mais pas la solution au problème) – stefaanv

+1

* Couper les espaces hors des chaînes dans une carte * - Qu'est-ce qui vous convainc le code fonctionne si vous n'avez pas utilisé une carte? Pourquoi ne pas écrire une fonction simple qui prend une chaîne et supprime l'espace blanc de fin et de fin, et oublier les cartes pour le moment? – PaulMcKenzie

Répondre

1

Votre problème est que vous utilisez sur un std::pair temporaire:

for (auto p : data) 

donc quand vous attribuez à p.second, vous ne changez rien dans le std::map. Au lieu de cela, vous devez itérer sur les références:

for (auto& p: data) 

Cette modification entraîne le passage de vos tests.

+0

merci pour votre aide !! –