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.
Vielleicht möchten Sie Operator Vorrang lesen, checkout '*' und '.' Vorrang: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz