2013-04-06 3 views
-2

я объявил СТЛ карту как этоткак вывести значение карты этого типа карты <карта < set< int >, Int>, Int> MyMap [2]

  map< map< set<int> ,int >, int> mymap[2] 

и я объявил итераторы как это

  set <int> ::iterator it3; 
     map< map< set<int> ,int >, int> :: iterator it1; 
     map< set<int> ,int > :: iterator it2; 

и я написал то, что некоторые, как этот

 for(it1=mymap[0].begin();it1!=mymap[0].end();it1++) 
    { 
      for(it2=(it1->first).begin();it2!=(it1->first).end();it2++) 
      { 
        for(it3=(it2->first).begin();it3!=(it2->first).end();it3++) 
        { 
        cout<<*it3<<" "<<it1->second<<endl; 
        } 
      }   
    } 
} 

я получаю некоторые странные ошибки любой орган может помочь мне

+0

Я нашел этот вопрос, не constructve – duDE

+1

я не чувствую склонен смотреть на это слишком ди (интересно, почему). Просто измените 'iterator' на' const_iterator', посмотрим, поможет ли это. – john

+0

Какая ошибка? – OGH

ответ

1

В вашем коде есть множество проблем. Самый тривиальный: вы пропустили точку с запятой после объявления вашей карты; Кроме того, у вас есть дополнительная скобка в конце.

Наконец, ключи карты являются const значения, и при вызове begin() на const контейнере, что вы получите это const_iterator, не iterator. Вот как вы должны исправить вашу программу:

#include <map> 
#include <set> 
#include <iostream> 

using std::map; 
using std::set; 
using std::cout; 
using std::endl; 

int main() 
{ 
    map< map< set<int> ,int >, int> mymap[2]; 
    //          ^MISSING SEMICOLON HERE 

    map< map< set<int> ,int >, int> :: iterator it1; 

    map< set<int> ,int > ::const_iterator it2; 
    //      ^^^^^^^^^^^^^^ <== MAP KEYS ARE CONST VALUES! 
    set <int> ::const_iterator it3; 
    //   ^^^^^^^^^^^^^^ <== MAP KEYS ARE CONST VALUES! 

    for(it1=mymap[0].begin();it1!=mymap[0].end();it1++) 
    { 
     for(it2=(it1->first).begin();it2!=(it1->first).end();it2++) 
     { 
       for(it3=(it2->first).begin();it3!=(it2->first).end();it3++) 
       { 
       std::cout<<*it3<<" "<<it1->second<<endl; 
       } 
     } 
    } 
    // } <== EXTRA BRACE HERE 
} 

также отметить, что в C++ 11 можно упростить с помощью auto, что спасло бы ваше от такого рода неприятностей:

int main() 
{ 
    map< map< set<int> ,int >, int> mymap[2]; 
    for (auto it1 = mymap[0].begin(); it1 != mymap[0].end(); it1++) 
    // ^^^^ 
    { 
     for (auto it2 = (it1->first).begin(); it2 != (it1->first).end(); it2++) 
     // ^^^^ 
     { 
       for (auto it3=(it2->first).begin(); it3!=(it2->first).end(); it3++) 
       // ^^^^ 
       { 
        std::cout<<*it3<<" "<<it1->second<<endl; 
       } 
     } 
    } 
} 

диапазонам на основе for петли сделать это еще проще:

int main() 
{ 
    map< map< set<int>, int >, int> mymap[2]; 
    for (auto const& m : mymap[0]) 
    { 
     for (auto const& s : m.first) 
     { 
      for (auto const& e : s.first) 
      { 
       std::cout << e << " " << m.second << endl; 
      } 
     } 
    } 
} 
+0

извините, сэр с запятой разыскивался, я не держался в вопросе –

+0

@rafanadal: Нет проблем, это происходит –

+0

остальное все у сказал правильно сэр –

Смежные вопросы