2013-02-15 13 views
5

Warum erhalte ich den folgenden Fehler, wenn ich auf die Werte des Paares in einem Iterator eines Vektors von Paaren zugreife?Fehler beim Abrufen des Werts vom Vektor der Paare

vector< pair<int,string> > mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (vector< pair<int,string> >::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << *it.first << " "   // <-- error! 
     << "2nd: " << *it.second << endl;  // <-- error! 
} 

Fehlermeldung:

main_v10.cpp:165:25: error: ‘std::vector > >::iterator’ has no member named ‘first’ main_v10.cpp:165:56: error: ‘std::vector > >::iterator’ has no member named ‘second’

Wie kann ich dieses Problem beheben?

+1

Vielleicht möchten Sie Operator Vorrang lesen, checkout '*' und '.' Vorrang: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz

Antwort

7

Dies ist ein Problem, das auch für Zeiger gilt (ein Iterator verhält sich ähnlich wie ein Zeiger). Es gibt zwei Möglichkeiten, ein Mitglied des Wertes des Zeigers (oder Iterator) verweist auf den Zugriff auf:

it->first  // preferred syntax: access member of the pointed-to object 

oder

(*it).first // verbose syntax: dereference the pointer, access member on it 

Operator Vorrang verwandelt Ihren Ausdruck in

*(it.first) // wrong! tries to access a member of the pointer (iterator) itself 

die versucht auf das Mitglied first auf dem Iterator selbst zuzugreifen, die fehlschlagen, weil es kein Element namens first hat. Wenn dies der Fall wäre, würden Sie den Wert dieses Mitglieds dereferenzieren.


Doch in den meisten solchen Fällen sollten Sie std::map verwenden von Schlüssel auf Werte abzubilden. Statt vector<pair<int,string> >, sollten Sie map<int,string> verwenden, die ähnlich verhält (Insertion, Iteration und so auch geschieht mit Paaren), aber es sortiert die Schlüssel in der Datenstruktur für einen schnelleren Zugriff:

map<int,string> mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (map<int,string>::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << it->first << " " 
     << "2nd: " << it->second << endl; 
} 

Beachten Sie, dass ein wesentlicher Unterschied zwischen Eine Karte und ein Vektor von Paaren besteht darin, dass eine Karte die Elemente neu anordnet, indem sie sie nach ihrem Schlüssel sortiert. Die Reihenfolge des Einfügens kann anschließend nicht abgefragt werden. Es gibt Fälle, in denen Sie dies nicht tun möchten (wenn der Anzeigenauftrag wichtig ist). In solchen Fällen ist entweder Ihre Lösung oder ein Vektor mit benutzerdefinierten Typen, die mindestens den Schlüssel und den Wert enthalten, die richtige Lösung.

+0

Ich denke, die zweite Variante sollte' (* es) .erst' –

+0

@ g-makulik Natürlich danke. – leemes

+0

Ja, 2. Option ist richtig! Vielen Dank. Du bist unglaublich! –

Verwandte Themen