C++

So verwenden Sie die ungeordnete C++-Map

So verwenden Sie die ungeordnete C++-Map
Eine Map, auch als assoziatives Array bekannt, ist eine Liste von Elementen, wobei jedes Element ein Schlüssel/Wert-Paar ist. Jeder Schlüssel entspricht also einem Wert. Verschiedene Schlüssel können den gleichen Wert haben, für normale Arbeit. Die Schlüssel können zum Beispiel eine Liste von Früchten sein und die entsprechenden Werte, die Farben der Früchte. In C++ ist die Map als Datenstruktur mit Memberfunktionen und Operatoren implementiert. Eine geordnete Karte ist eine Karte, bei der die Elementpaare nach Schlüsseln geordnet wurden. Eine ungeordnete Karte ist eine, auf der es keine Ordnung gibt. In diesem Artikel wird die Verwendung der ungeordneten C++-Map, geschrieben als unordered_map, erklärt. Sie benötigen Kenntnisse in C++-Zeigern, um diesen Artikel zu verstehen. unordered_map ist Teil der C++-Standardbibliothek.

Klasse und Objekte

Eine Klasse ist ein Satz von Variablen und Funktionen, die zusammenarbeiten, wobei den Variablen keine Werte zugewiesen sind. Wenn den Variablen Werte zugewiesen werden, wird die Klasse zu einem Objekt. Unterschiedliche Werte für dieselbe Klasse führen zu unterschiedlichen Objekten; das heißt, verschiedene Objekte sind dieselbe Klasse mit unterschiedlichen Werten. Das Erstellen eines Objekts aus einer Klasse wird als Instanziieren des Objekts bezeichnet.

Der Name unordered_map ist eine Klasse. Ein aus der Klasse unordered_map erstelltes Objekt hat einen vom Programmierer gewählten Namen.

Eine Funktion, die zu einer Klasse gehört, wird benötigt, um ein Objekt aus der Klasse zu instanziieren. In C++ hat diese Funktion denselben Namen wie der Name der Klasse. Objekte, die aus der Klasse erstellt (instanziiert) werden, haben unterschiedliche Namen, die ihnen vom Programmierer gegeben werden.

Ein Objekt aus der Klasse zu erstellen bedeutet, das Objekt zu konstruieren; es bedeutet auch instanziieren.

Ein C++-Programm, das die Klasse unordered_map verwendet, beginnt mit den folgenden Zeilen am Anfang der Datei:

#einschließen
#einschließen
Verwenden von Namespace-Std;

Die erste Zeile ist für die Eingabe/Ausgabe. Die zweite Zeile soll dem Programm erlauben, alle Funktionen der Klasse unordered_map zu verwendenmap. Die dritte Zeile erlaubt dem Programm, die Namen im Standard-Namensraum zu verwenden.

Überladen einer Funktion

Wenn zwei oder mehr verschiedene Funktionssignaturen denselben Namen haben, wird dieser Name als überladen bezeichnet. Wenn eine Funktion aufgerufen wird, bestimmen die Anzahl und Art der Argumente, welche Funktion tatsächlich ausgeführt wird.

Konstruktion/Kopie Konstruktion

Einfache Konstruktion

Eine ungeordnete Karte kann wie folgt erstellt und mit Werten versehen werden:

ungeordnete_map umap;
umap["banane"] = "gelb";
umap["Traube"] = "grün";
umap["fig"] = "lila";

Die Deklaration beginnt mit der Template-Spezialisierung mit den Typen für die Schlüssel-Wert-Paare. Darauf folgt der vom Programmierer gewählte Name für die Map; dann ein Semikolon. Das zweite Codesegment zeigt, wie man ihren Tasten Werte zuweist.
Konstruktion nach Initializer_list
Dies kann wie folgt erfolgen:

ungeordnete_map umap ("Banane", "Gelb",
"Traube", "Grün", "Feige", "Lila");

Aufbau durch Zuweisung von Initializer_list
Beispiel:

ungeordnete_map umap = "Banane", "Gelb",
"Traube", "Grün", "Feige", "Lila";

Konstruktion durch Kopieren einer anderen unordered_map
Beispiel:

ungeordnete_map umap1 ("Banane", "Gelb",
"Traube", "Grün", "Feige", "Lila");
ungeordnete_map umap2 (umap1);

Das Paar Element

Der folgende Code zeigt, wie Sie das Paarelement erstellen und darauf zugreifen:

Paar pr = 'd', "Meer";
cout << pr.first << '\n';
cout << pr.second << '\n';

Die Ausgabe ist:

d
Meer

erstes und zweites sind reservierte Wörter für die beiden Elemente des Paares. Die Werte im Paar können noch mit first und second geändert werden.

Ein Paar heißt value_type im Topic der ungeordneten Map.

unordered_map Elementzugriff

mapped_type& Operator[](key_type&& k)
Gibt den Wert für den entsprechenden Schlüssel zurück. Beispiel:

ungeordnete_map umap;
umap["banane"] = "gelb";
umap["Traube"] = "grün";
umap["fig"] = "lila";
const char *ret = umap["Traube"];
cout << ret <<'\n';

Die Ausgabe ist: „grün“. Werte können auf die gleiche Weise zugewiesen werden - siehe oben.

unordered_map Kapazität

size_type size() const noexcept
Gibt die Anzahl der Paare in der Karte zurück.

ungeordnete_map umap;
umap["banane"] = "gelb";
umap["Traube"] = "grün";
umap["fig"] = "lila";
cout << umap.size() <<'\n';

Ausgang ist 3.

bool empty() const noexcept

Gibt 1 für wahr zurück, wenn die Karte kein Paar hat, und 0 für falsch, wenn sie Paare hat. Beispiel:

ungeordnete_map umap;
cout << umap.empty() <<'\n';

Ausgang ist 1.

Zurückgebende Iteratoren und die Klasse der ungeordneten Karte

Ein Iterator ist wie ein Zeiger, hat aber mehr Funktionalität als der Zeiger.

begin() keine Ausnahme

Gibt einen Iterator zurück, der auf das erste Paar des Kartenobjekts zeigt, wie im folgenden Codesegment:

ungeordnete_map umap;
umap["banane"] = "gelb"; umap["Traube"] = "grün"; umap["fig"] = "lila";
ungeordnete_map::iterator iter = umap.Start();
Paar pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

Die Ausgabe ist: Feige, Lila. Die Karte ist ungeordnet.

begin() const noexcept;

Gibt einen Iterator zurück, der auf das erste Element der Kartenobjektsammlung zeigt. Wenn der Objektkonstruktion const vorangestellt ist, wird der Ausdruck „begin() const“ anstelle von „begin()“ ausgeführt. Unter dieser Bedingung können die Elemente im Objekt nicht geändert werden. Es wird zum Beispiel im folgenden Code verwendet.

const unordered_map umap ("Banane", "Gelb",
"Traube", "Grün", "Feige", "Lila");
ungeordnete_map::const_iterator iter = umap.Start();
Paar pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

Die Ausgabe ist: Feige, Lila. Die Karte ist ungeordnet. Beachten Sie, dass diesmal const_iterator anstelle von nur iterator verwendet wurde, um den zurückgegebenen Iterator zu erhalten.

end() keine Ausnahme

Gibt einen Iterator zurück, der direkt über das letzte Element des Kartenobjekts hinaus zeigt.

end() const noexcept

Gibt einen Iterator zurück, der direkt über das letzte Element des Kartenobjekts hinaus zeigt. Wenn der Konstruktion des Kartenobjekts const vorangestellt ist, wird der Ausdruck „end() const“ anstelle von „end()“ ausgeführt.

unordered_map Operationen

Iterator find(const key_type& k)

Sucht nach einem Paar des angegebenen Schlüssels in der Karte. Wenn es gefunden wird, gibt es den Iterator zurück. Wenn es nicht gefunden wird, gibt es einen Iterator zurück, der auf das Ende der Karte zeigt, die kein Paar ist. Der folgende Code zeigt, wie diese Memberfunktion verwendet wird:

ungeordnete_map umap;
umap['a'] = 'b'; umap['c'] = 'd'; umap['e'] = 'f';
ungeordnete_map::iterator iter = umap.find('c');
wenn (umap.find('c') != umap.Ende())

Paar pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

Die Ausgabe ist: c, d

const_iterator find(const key_type& k) const;

Diese Version der Funktion wird aufgerufen, wenn die Erstellung der ungeordneten Karte mit const beginnt, wodurch alle Elemente der Karte schreibgeschützt sind.

unordered_map Modifikatoren

Paar insert(value_type&& obj)
Eine ungeordnete Karte bedeutet, dass die Paare in keiner Reihenfolge sind. Das Programm fügt das Paar also an einer beliebigen Stelle ein, die es für bequem hält. Die Funktion gibt zurück, Paar. Wenn das Einfügen erfolgreich war, ist bool 1 für wahr, andernfalls 0 für falsch. Wenn das Einfügen erfolgreich ist, zeigt der Iterator auf das neu eingefügte Element. Der folgende Code veranschaulicht die Verwendung:

ungeordnete_map umap;
umap["banane"] = "gelb";
umap["Traube"] = "grün";
umap["fig"] = "lila";
umap.insert("Kirsche", "Rot", "Erdbeere", "Rot");
cout << umap.size() << '\n';

Die Ausgabe ist: 5. Es kann mehr als ein Paar eingefügt werden.

size_type delete(const key_type& k)

Diese Funktion löscht ein Paar aus der unordered_map. Das folgende Codesegment veranschaulicht:

ungeordnete_map umap;
umap["banane"] = "gelb";
umap["Traube"] = "grün";
umap["fig"] = "lila";
int num = umap.löschen("Traube");
cout << umap.size() << '\n';

Ausgang ist 2.
void swap(unordered_map&)
Zwei ungeordnete Maps können ausgetauscht werden, wie in diesem Codesegment dargestellt:

ungeordnete_map umap1 = "Banane", "Gelb",
"Traube", "Grün", "Feige", "Lila", "Erdbeere", "Rot";
ungeordnete_map umap2 = "Kirsche", "Rot", "Limette", "Grün";
umap1.tauschen (umap2);
ungeordnete_map::iterator iter1 = umap1.Start();
Paar pr1 = *iter1;
ungeordnete_map::iterator iter2 = umap2.Start();
Paar pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
ungeordnete_map umap1 = "Banane", "Gelb",
"Traube", "Grün", "Feige", "Lila", "Erdbeere", "Rot";
ungeordnete_map umap2 = "Kirsche", "Rot", "Limette", "Grün";
umap1.tauschen (umap2);
ungeordnete_map::iterator iter1 = umap1.Start();
Paar pr1 = *iter1;
ungeordnete_map::iterator iter2 = umap2.Start();
Paar pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';

Die Ausgabe ist:

Erster Schlüssel und Größe von umap1: Limette, 2

Erster Schlüssel und Größe von umap2 Erdbeere, 4

Die Karte ist ungeordnet. Beachten Sie, dass die Länge einer Karte bei Bedarf erhöht wird. Die Datentypen müssen gleich sein.

Klasse und ihre instanziierten Objekte

Ein Wert gehört zu einem Datentyp wie ein instanziiertes Objekt zu einer Klasse. Die ungeordnete Kartenkonstruktion kann auch eine Klasse als Datentyp akzeptieren. Das folgende Programm veranschaulicht dies:

#einschließen
#einschließen
Verwenden von Namespace-Std;
Klasse TheCla

Öffentlichkeit:
int-Zahl;
statisches Zeichen ch;
void func (char cha, const char *str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statischer Leerspaß (char ch)

if (ch == 'a')
cout << "Official static member function" << '\n';

;
int main()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
ungeordnete_map umap;
umap = "Banane", obj1, "Traube", obj2, "Feige", obj3, "Erdbeere", obj4, "Limette", obj5;
cout << umap.size() << '\n';
0 zurückgeben;

Die Ausgabe ist: 5.

Die Klassendefinition hat zwei öffentliche Datenmember und zwei öffentliche Memberfunktionen. In der Funktion main() werden verschiedene Objekte für die Klasse instanziiert. Anschließend wird eine ungeordnete Karte instanziiert, wobei jedes Paar aus dem Namen einer Frucht und einem Objekt der Klasse besteht. Die Größe der Karte wird angezeigt. Das Programm wird ohne Warnung oder Fehlermeldung kompiliert.

Anwendung der Karte

Das Array ordnet dem Wert einen Index zu. Schlüssel/Wert-Paare gibt es in vielen Lebenssituationen, die programmiert werden können. Das Schlüssel/Wert-Paar Frucht/Farbe ist nur ein Beispiel. Ein weiteres Beispiel sind die Namen von Personen und ihr Alter. In diesem Fall ist das Paar vom Typ Paar. Es kann auch ein Paar sein. Im letzteren Fall wird die Vorverarbeitungsrichtlinie verwendet. Ein Schlüssel/Wert-Paar kann immer noch der Name von Ehepaaren sein. In Ländern, in denen Polygamie herrscht, gibt es verschiedene Ehefrauen für einen Mann.

Bildung einer Karte

Eine Karte ist kein zweidimensionales Array mit zwei Spalten. Eine Karte arbeitet mit einer Hash-Funktion. Der Schlüssel wird von der Hash-Funktion in eine ganze Zahl eines Arrays codiert. Es ist dieses Array, das die Werte enthält. Es gibt also tatsächlich ein Array mit den Werten, und die Schlüssel werden den Indizes des Arrays zugeordnet, und so werden die Entsprechungen zwischen Schlüsseln und Werten hergestellt. Hashing ist ein umfangreiches Thema und wird in diesem Artikel nicht behandelt.

Fazit

Eine Map, auch als assoziatives Array bekannt, ist eine Liste von Elementen, wobei jedes Element ein Schlüssel/Wert-Paar ist. Jeder Schlüssel entspricht also einem Wert. In C++ ist die Map als Datenstruktur mit Memberfunktionen und Operatoren implementiert. Eine geordnete Karte ist eine Karte, bei der die Elementpaare nach Schlüsseln geordnet wurden. Eine ungeordnete Karte ist eine Karte, bei der es keine Ordnung gibt.

Technisch gesehen besteht ein Hash aus einem Paar Elemente. Tatsächlich ist das Paar eine ganze Datenstruktur mit ihren Memberfunktionen und Operatoren. Die beiden Vorlagenparameter für das Paar sind die gleichen zwei Vorlagenparameter für die unordered_map.

Die initializer_list für die Map ist ein Array-Literal von Literalen. Jedes interne Literal besteht aus zwei Objekten, dem Schlüssel/Wert-Paar.

Die Memberfunktionen und Operatoren für unordered_map können unter den folgenden Überschriften kategorisiert werden: unordered_map-Konstruktion/Copy-Konstruktion, unordered_map-Kapazität, unordered_map-Iterator, unordered_map-Operationen und unordered_map-Modifikatoren.

Eine ungeordnete Zuordnung wird verwendet, wenn ein Schlüssel einem Wert zugeordnet werden muss.

Chrys

Nützliche Tools für Linux-Spieler
Wenn Sie gerne unter Linux spielen, haben Sie wahrscheinlich Apps und Dienstprogramme wie Wine, Lutris und OBS Studio verwendet, um das Spielerlebnis ...
HD-Remastered-Spiele für Linux, die noch nie zuvor eine Linux-Version hatten
Viele Spieleentwickler und -herausgeber entwickeln HD-Remaster alter Spiele, um die Lebensdauer des Franchise zu verlängern. Bitte Fans, die Kompatibi...
So verwenden Sie AutoKey zur Automatisierung von Linux-Spielen
AutoKey ist ein Desktop-Automatisierungsdienstprogramm für Linux und X11, programmiert in Python 3, GTK und Qt. Mithilfe der Skript- und MACRO-Funktio...