2009-04-23 8 views
1

fondamentalement j'ai des paires (état, code d'état), qui sont des sous-ensembles du pays [USA] -> [VT] -> 32std :: map <tstring <std :: carte <tstring, unsigned int >> affectation échoue

donc je suis en utilisant std::map<tstring<std::map<tstring, unsigned int>> mais je vais avoir du mal avec l'attribution du code d'état

for(std::map<tstring, std::map<tstring, unsigned int>>::const_iterator it = countrylist.begin(); it != countrylist.end(); ++it) 
{ 
foundCountry = !it->first.compare(_T("USA")); //find USA 
if(foundCountry) it->second[_T("MN")] = 5; //Assignment fails 
} 

error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>'

+0

Avez-vous utilisé STL avant? – user44511

+0

bien pas trop évidemment c'est pourquoi je demande. J'ai un livre STL provenant d'Amazon. – 0x4f3759df

Répondre

6

L'opérateur [] sur std :: map est non-const, car il crée l'entrée si elle n'existe pas déjà. Vous ne pouvez donc pas utiliser un const_iterator de cette manière. Vous pouvez utiliser find() sur les cartes const, mais cela ne vous permettra pas de modifier leurs valeurs. Smashery est juste, vous faites la première recherche d'une manière étrange étant donné que vous avez une carte. Puisque vous modifiez clairement la chose, qu'est-ce qui ne va pas?

countryList[_T("USA")][_T("MN")] = 5; 
3

Si vous êtes désireux de trouver un élément dans une carte, vous pouvez utilisez la méthode find:

std::map<tstring, std::map<tstring, unsigned int>::iterator itFind; 
itFind = countrylist.find(_T("USA")); 
if (itFind != countrylist.end()) 
{ 
    // Do what you want with the item you found 
    it->second[_T("MN")] = 5; 
} 

De même, vous voudrez utiliser itérateur, et non const_iterator. Vous ne pouvez pas modifier la carte si vous utilisez un const_iterator, car: c'est const!

Questions connexes