tags:

views:

845

answers:

2

basically i have (state, state code) pairs, that are subsets of country [USA] -> [VT] -> 32

so i'm using std::map<tstring<std::map<tstring, unsigned int>> but i'm having trouble with assignment of the state code

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

Thanks in advance!.

+3  A: 

If you're wanting to find an element in a map, you can use the find method:

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

Also, you'll want to be using iterator, and not const_iterator. You can't modify the map if you use a const_iterator, because: it's const!

Smashery
+4  A: 

operator[] on std::map is non-const, because it creates the entry if it doesn't already exist. So you can't use a const_iterator in this way. You can use find() on const maps, but that still won't let you modify their values.

And Smashery is right, you're doing the first lookup in a strange way considering that you have a map. Since you're clearly modifying the thing, what's wrong with this?

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