2016-11-06 2 views
1

Ich bin sehr neu in der Verwendung von STL-Containern in C++.C++ - Iterieren durch eine Karte von 3 Elementen

Ich habe eine Karte von 3 Elementen -

map<pair<string, string>, int> wordpairs; 

Aber wenn ich versuche, durch es so iterieren (2 Strings als Paar als Schlüssel fungieren, und ein int, der als der Wert.):

for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs.end(); i++) { 
     cout << i->first << " " << i->second << "\n"; 
    } 

der Compiler wirft Fehler:

 error: expected ‘;’ before ‘i’ 
     for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs. 
                ^
    error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive] 
    a7a.cpp:46:50: note: (if you use ‘-fpermissive’ G++ will accept your code) 

    error: cannot convert ‘std::map<std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int> >}’ to ‘int’ in assignment 
     for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs. 
                 ^
    error: no match for ‘operator!=’ (operand types are ‘int’ and ‘std::map<std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int> >}’) 
     for (map<pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs. 
                      ^ 

    error: expected ‘)’ before ‘;’ token 
    pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs.end(); i++) { 
                        ^
    error: expected ‘;’ before ‘)’ token 
    pair<string, string>, int> iterator i = wordpairs.begin(); i != wordpairs.end(); i++) { 

nicht sicher, was ich falsch hier zu tun - dies sollte eine einfache Lösung sein.

+1

sollte es nicht Karte , int> :: iterator i sein ?? map , int> iterator i macht keinen Sinn ... Sie deklarieren zwei Variablen auf einmal (iterator und i) – solti

+1

Verwenden von Leerzeichen, wo Sie Doppelpunkte benötigen. – Peter

+0

Danke Jungs! Das hat das Problem gelöst! – RockAndaHardPlace

Antwort

3
  1. Sie falsch die Art bekam (Sie Leerzeichen statt :: verwendet) .

  2. Map Iterator gibt Ihnen ein Schlüsselwertpaar - und Ihr Schlüssel ist ein Paar! Sie haben also ein Paar mit einem Paar als Mitglied. Hier ist ein Beispiel, das ungefähr das tut, was Sie tun möchten.

    #include <iostream> 
    #include <map> 
    #include <string> 
    #include <utility> 
    using namespace std; 
    
    int main() { 
        pair<string, string> my_key("To", "Be"); 
        map<pair<string, string>, int> wordpairs { { {"Hello", "World"}, 33} }; 
        for (const auto& kv : wordpairs) { 
        cout << kv.first.first << ", " 
         << kv.first.second << static_cast<char>(kv.second); 
        } 
        return 0; 
    } 
    
+0

Ich tat dies: 'cout << i. first.first << "" << i.first.second << "\ n" << static_cast (kv.second); 'aber es wirft Fehler. Auch, nicht sicher, warum wir verwenden:' static_cast (kv.2.) ' – RockAndaHardPlace

+1

Wenn Sie einen Iterator verwenden, denken Sie daran, dass sie sich wie Zeiger verhalten. also statt "i.first.first" solltest du 'i-> first.first' verwenden. Auch die 'static_cast (....)' war süß - führen Sie mein Beispiel durch einen C++ 11 Compiler und sehen Sie, was das folgende Programm tut =). – druckermanly

+0

Ich bekomme ein komisches Zeichen mit binären Ziffern auf dem Ausgang lol. – RockAndaHardPlace

2

Sie haben :: vor Iterator vergessen.
Sie können auch die Auto-Schlüsselwort:

for (auto i = wordpairs.begin(); i != wordpairs.end(); ++i) { 
    cout << i->first << " " << i->second << "\n"; 
} 

oder einfach nur die bereichsbasierte for-Schleife:

for (auto& i : wordpairs) { 
    cout << i->first << " " << i->second << "\n"; 
} 
+0

Dank @Djerdjer! Das behebt dieses Problem, aber jetzt habe ich ein anderes Problem: Fehler: keine Übereinstimmung für 'Operator <<' an der Linie: cout << i-> erste << " " << i-> zweite << "\ n"; Dies hängt jedoch nicht mit der ursprünglichen Frage zusammen, nehme ich an. – RockAndaHardPlace

+0

Ist der Header in Ihrem Programm enthalten? – Djerdjer

+0

Ja, es ist enthalten. – RockAndaHardPlace

Verwandte Themen