Diese SO-Antwort besagt, dass die STL-Karte mit einem Vektor für den Schlüssel Vektor als Schlüssel verwendet werden kann. Wenn wir also einen Vektor als Schlüssel verwenden. Wie funktioniert das tatsächlich, da der Schlüssel eindeutig sein map
muss? Wenn wir also einen anderen Vektor mit denselben Elementen einfügen, wird die Überprüfung auf doppelte Elemente für Elemente oder der Name des Vektors etwas angeben? Wie der Name des Arrays die Basisadresse darstellt. Ein Array kann also als Schlüssel verwendet werden, da die Basisadresse in diesem Fall als Schlüssel verwendet werden kann, aber was ist der Schlüssel im Fall eines Vektors. Wie funktioniert es intern?
Denn wenn ich den Namen des Vektors drucke, wird eine Fehlermeldung angezeigt
vector<int> v;
cout<<v; //error
has operators == and <
Wie hilft das? Meine Frage war zu überprüfen, ob doppelte Elemente zugeordnet sind, um den Vektorschlüssel Element für Element zu vergleichenstd::vector
als Schlüssel für zu verwendenstd::map
. Sie bezahlen für das, was Sie verwenden . Es kann getan werden, und vielleicht gibt es einige Anwendungsfälle dafür, aber mit Sicherheit können Sie die Datenstruktur Ihrer Wahl ändern. STL-Container sind so konzipiert, dass sie maximal vielseitig und in jeder Weise verwendbar sind, die der Benutzer jemals verwenden möchte.std::map
kopiert sowohl Schlüssel als auch Wert in sich.std::unordered_map
kann den Hash des Schlüssels speichern.Antworten:
Es gibt einen überladenen Operator <für die Klassenvorlage std :: vector.
das basiert auf dem Standardalgorithmus
std::lexicographical_compare
.Hier ist ein Demonstrationsprogramm.
Seine Ausgabe ist
Die Klasse kann also als Schlüssel in der Karte verwendet werden.
Standardmäßig verwendet die Klassenvorlagenzuordnung das Funktionsobjekt std :: less, das wiederum den Operator <verwendet
Es gibt jedoch keinen überladenen Operator << für die Klassenvorlage std :: vector.
quelle
Der Name eines Objekts und der Inhalt dieses Objekts sind immer nicht miteinander verbundene Dinge.
operator ==
forstd::vector
vergleicht zuerst die Länge der Vektoren und dann auch jedes seiner Elemente mitoperator ==
.operator <
vergleicht Elemente in Vektoren lexikographisch, dh es wirdx[i] < y[i]
für das erste ungleiche Element in Vektorenx
und zurückgegebeny
.Dies sind die Anforderungen
std::map
für einen Typ, der als verwendet wirdKey
. Dastd::vector
beide erfüllt sind, kann es von as verwendet werdenKey
. Beachten Sie, dass für den von vector verwalteten Typ auch diese Operatoren überladen sein müssen, damit dies funktioniert (dastd::vector
diese Operatoren ihre eigenen Operatoren implementieren müssen).quelle