Mankind
Mankind

Reputation: 51

Nested Map, accesing inner map value

For example I have a map like this:

    map<string , map <int , int>> example;

and an iterator:

    map<string , map <int, int>>::iterator iter;
    string word;

And i want to access to the inner map :

  for(iter = example.begin();iter!=example.end;iter++){

       iter = Map.find(word);
       iter -> second // 
  } 

What i should do to access the inner map just for example if iter->second ==4 -it's is not correct , or can i do (iter->second)->second ??? can u give me an advise. i undestand that iterator is giving me a pair of (int,int) so i tryed to do another iterator map ::iterator i; and to assing iter->second = i, but it didin't help me to;

Upvotes: 3

Views: 19807

Answers (2)

Slava
Slava

Reputation: 44238

For complex types use typedef it will make your life much easier:

typedef std::map< int, int > Ints;
typedef std::map< std::string, Ints > String2Ints;

String2Ints example;
std::string word;

String2Ints::iterator it = example.find( word );
if( it != example.end() ) {
   Ints &innerMap = it->second;
   Ints::iterator innerit = innerMap.find( 4 );
   if( innerit != innerMap.end() ) 
       std::cout << "found value for word " << word << " 4 - " << innerit->second << std::endl;
}

Also your loop and find inside is incorrect, you should either iterate over map or search for value by find(), what you do in your code does not make any sense (technically infinite loop if word is found)

Upvotes: 5

fhsilva
fhsilva

Reputation: 1257

iter->second is a map, so if you want to find something in it you need another find. You can also use your iterator directly, without the for loop. Ex:

map<string , map <int, int>>::iterator iter;
iter = example.find(word);

if (iter != example.end()){
   map<int, int>>::iterator innerIter;
   int key = 4;
   innerIter = iter->second.find(key);
   if (innerIter != iter->second.end()){
       (...)
   }
}

Upvotes: 3

Related Questions