2010-10-01 14 views
1

J'ai un map d'un vector de char et un vector de strings. De temps en temps, si j'ai déjà vu le vecteur des personnages, j'aimerais ajouter une chaîne à mon vecteur de chaînes. Voici mon code pour le faire.std :: map :: effacer la boucle infinie

map<vector<char>, vector<string>>::iterator myIter = mMyMap.find(vChars); 
if(myIter != mMyMap.end()) { 
    vector<string> vStrings = myIter->second; 
    mMyMap.erase(myIter); 
    vStrings.push_back(some_other_string); 
    mMyMap.insert(pair<vector<char>, vector<string>>(vChars, vStrings)); 
    return TRUE; 
} 

L'appel à mMyMap.erase() semble rester coincé dans une boucle infinie cependant. Je suppose que c'est parce que vStrings ne reçoit pas une copie profonde de myIter->second.

Ai-je besoin de vStrings comme initialiser:

vector<string> vStrings(myIter->second); 

Ou quel est le correctif approprié?

+1

La copie est bien, et oui c'est une copie profonde. La seconde forme d'initialisation a le même effet que la première. –

+0

Génial, c'est super à savoir, André. Merci :) – mrduclaw

Répondre

3

Je ne vois pas d'erreur dans le fragment de code affiché (autre qu'un ) manquant). Mais je suggère de simplifier les lignes 2-8 pour:

if(myIter != mMyMap.end()) { 
    myIter->second.push_back(some_other_string); 
} 
+0

Quelque chose est encore funky avec la façon dont je le faisais, mais cela résout mon problème, c'est encore mieux. Merci :) – mrduclaw

1

vecteur vStrings = myIter-> second;
et
vecteur vStrings (myIter-> second);
sont les mêmes choses. Ils appellent tous deux un constructeur de copie. Et la copie est en copie profonde seulement. Ma conjecture est que le vecteur qui est copié est trop grand (ou long). Chaque élément du vecteur sera copié un par un. Et d'où le temps.