So verwenden Sie C ++ ungeordnete Karte

So verwenden Sie C ++ ungeordnete Karte
Eine Karte, auch als assoziatives Array bezeichnet. Jeder Schlüssel entspricht einem Wert. Verschiedene Schlüssel können den gleichen Wert für gewöhnliche Arbeiten haben. Zum Beispiel können die Schlüssel eine Liste von Früchten und die entsprechenden Werte, die Farben der Früchte sein. In C ++ wird die Karte als Datenstruktur mit Mitgliedsfunktionen und Operatoren implementiert. Eine bestellte Karte ist eine, bei der die Elementpaare von Schlüssel bestellt wurden. Eine ungeordnete Karte ist eine, bei der es keine Reihenfolge gibt. In diesem Artikel wird erklärt. Sie benötigen Wissen in C ++ - Zeiger, um diesen Artikel zu verstehen. Under Ordered_Map ist Teil der C ++ - Standardbibliothek.

Klasse und Objekte

Eine Klasse ist eine Reihe von Variablen und Funktionen, die zusammenarbeiten, wobei die Variablen keine Werte zugewiesen sind. Wenn der Variablen Werte zugewiesen werden, wird die Klasse zu einem Objekt. Verschiedene Werte, die derselben Klasse angegeben werden, führen zu verschiedenen Objekten. Das heißt, verschiedene Objekte sind dieselbe Klasse mit unterschiedlichen Werten. Das Erstellen eines Objekts aus einer Klasse soll das Objekt instanziieren.

Der Name Under Ordered_map ist eine Klasse. Ein aus der Klasse von Under Ordered_map erstellter Objekt enthält einen Programmierer -ausgewählten Namen.

Eine Funktion, die zu einer Klasse gehört, ist erforderlich, um ein Objekt aus der Klasse zu instanziieren. In C ++ hat diese Funktion den gleichen Namen wie der Name der Klasse. Objekte, die aus der Klasse erstellt (instanziiert) wurden, haben vom Programmierer unterschiedliche Namen gegeben.

Das Erstellen eines Objekts aus der Klasse bedeutet, das Objekt zu konstruieren. Es bedeutet auch Instanziation.

Ein C ++ - Programm, das die Klasse Under Ordered_Map verwendet, beginnt mit den folgenden Zeilen oben in der Datei:

#enthalten
#enthalten
Verwenden von Namespace STD;

Die erste Zeile gilt für Eingabe/Ausgabe. Die zweite Zeile besteht darin, dass das Programm alle Funktionen der nicht ordnungsgemäßen Klasse verwenden kann. Mit der dritten Zeile kann das Programm die Namen im Standard -Namespace verwenden.

Überladen einer Funktion

Wenn zwei oder mehr verschiedene Funktionssignaturen denselben Namen haben, soll dieser Name überlastet werden. Wenn eine Funktion aufgerufen wird, bestimmen Sie die Anzahl und die Art von Argumenten, welche Funktion tatsächlich ausgeführt wird.

Konstruktions-/Ausführung

Einfache Konstruktion

Eine ungeordnete Karte kann wie folgt konstruiert und zugewiesen werden:

Under Ordered_map Umap;
UMAP ["Banane"] = "gelb";
Umap ["Grape"] = "Green";
Umap ["Fig"] = "lila";

Die Deklaration beginnt mit der Vorlagenspezialisierung mit den Typen für die Schlüssel- und Wertpaare. Darauf folgt der ausgewählte Name des Programmierers für die Karte. Dann ein Semikolon. Das zweite Codesegment zeigt, wie Sie ihren Schlüssel Werte zuweisen können.
Konstruktion von Initializer_List
Dies kann wie folgt erfolgen:

Under Ordered_map Umap ("Banana", "Yellow",
"Grape", "Green", "Fig", "lila");

Konstruktion durch Zuweisung von Initializer_List
Beispiel:

Under Ordered_map Umap = "Banana", "gelb",
"Grape", "Green", "Fig", "lila";

Konstruktion durch Kopieren eines weiteren nicht ordnungsgemäßen
Beispiel:

Under Ordered_map Umap1 ("Banana", "Yellow",
"Grape", "Green", "Fig", "lila");
Under Ordered_map UMAP2 (UMAP1);

Das Paarelement

Der folgende Code zeigt, wie das Paarelement erstellt und zugreift:

Paar pr = 'd', "see";
Cout << pr.first << '\n';
Cout << pr.second << '\n';

Die Ausgabe ist:

D
Meer

Zuerst und zweitens sind reservierte Wörter für die beiden Elemente im Paar. Die Werte im Paar können weiterhin mit dem ersten und zweiten geändert werden.

Ein Paar heißt Value_type im Thema der ungeordneten Karte.

Under Ordered_map -Elementzugriff

maped_type & operator [] (KEY_TYPE && K)
Gibt den Wert für den entsprechenden Schlüssel zurück. Beispiel:

Under Ordered_map Umap;
UMAP ["Banane"] = "gelb";
Umap ["Grape"] = "Green";
Umap ["Fig"] = "lila";
const char *ret = Umap ["Grape"];
Cout << ret <<'\n';

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

nicht ordnungsgemäße Kapazität

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

Under Ordered_map Umap;
UMAP ["Banane"] = "gelb";
Umap ["Grape"] = "Green";
Umap ["Fig"] = "lila";
Cout << umap.size() <<'\n';

Ausgabe ist 3.

bool leer () const noexcept

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

Under Ordered_map Umap;
Cout << umap.empty() <<'\n';

Ausgabe ist 1.

Rückkehrer Iteratoren und der nicht ordnungsgemäßen Klasse

Ein Iterator ist wie ein Zeiger, hat aber mehr Funktionen als der Zeiger.

begin () noexcept

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

Under Ordered_map Umap;
UMAP ["Banane"] = "gelb"; Umap ["Grape"] = "Green"; Umap ["Fig"] = "lila";
Under Ordered_map:: iterator iter = umap.Start();
Paar pr = *iter;
Cout << pr.first << ", " << pr.second << '\n';

Der Ausgang ist: Abb, lila. Die Karte ist nicht ordnungsgemäß.

begin () const noexcept;

Gibt einen Iterator zurück, der auf das erste Element der Kartenobjektsammlung verweist. Wenn die Objektkonstruktion von const vorausgeht, 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 uncordered_map Umap ("Banana", "Yellow",
"Grape", "Green", "Fig", "lila");
Under Ordered_map:: const_iterator iter = umap.Start();
Paar pr = *iter;
Cout << pr.first << ", " << pr.second << '\n';

Der Ausgang ist: Abb, lila. Die Karte ist nicht ordnungsgemäß. Beachten Sie, dass Const_iterator diesmal anstelle von Iterator verwendet wurde, um den zurückgegebenen Iterator zu empfangen.

end () noexcept

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

End () const noexcept

Gibt einen Iterator zurück, der unmittelbar über das letzte Element des Kartenobjekts hinaus zeigt. Wenn die Konstruktion der Kartenobjekte vorangestellt ist, wird der Ausdruck "End () const" anstelle von "End ()" ausgeführt.

nicht ordnungsgemäße Operationen

Iterator Find (const key_type & k)

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

Under Ordered_map Umap;
Umap ['a'] = 'B'; Umap ['C'] = 'D'; umap ['e'] = 'f';
Under Ordered_map:: iterator iter = umap.find ('c');
if (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 werden.

Under Ordered_Map -Modifikatoren

Paar Insert (value_type && obj)
Eine ungeordnete Karte bedeutet, dass die Paare nicht in irgendeiner Reihenfolge sind. Das Programm fügt das Paar also an jedem Ort ein, an dem es bequem ist. Die Funktion kehrt zurück, Paar. Wenn die Einfügung erfolgreich wäre, ist Bool 1 für wahr, sonst wäre es 0 für false. Wenn die Einfügung erfolgreich ist, verweist der Iterator auf das neu eingefügte Element. Der folgende Code zeigt die Verwendung:

Under Ordered_map Umap;
UMAP ["Banane"] = "gelb";
Umap ["Grape"] = "Green";
Umap ["Fig"] = "lila";
Umap.insert ("Cherry", "rot", "Strawberry", "Red");
Cout << umap.size() << '\n';

Die Ausgabe ist: 5. Es können mehr als ein Paar eingefügt werden.

size_type erase (const key_type & k)

Diese Funktion löscht ein Paar aus der unordneten. Das folgende Codesegment zeigt:

Under Ordered_map Umap;
UMAP ["Banane"] = "gelb";
Umap ["Grape"] = "Green";
Umap ["Fig"] = "lila";
int num = umap.löschen ("Traube");
Cout << umap.size() << '\n';

Ausgabe ist 2.
Hohlraumtausch (nicht ordnungsgemäß_map &)
Zwei ungeordnete Karten können ausgetauscht werden, wie in diesem Codesegment dargestellt:

Under Ordered_map Umap1 = "Banana", "gelb",
"Grape", "Green", "Fig", "lila", "Strawberry", "Red";
Under Ordered_map Umap2 = "Cherry", "rot", "Lime", "grün";
Umap1.Swap (UMAP2);
Under Ordered_map:: iterator iter1 = umap1.Start();
Paar pr1 = *iter1;
Under Ordered_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';
Under Ordered_map Umap1 = "Banana", "gelb",
"Grape", "Green", "Fig", "lila", "Strawberry", "Red";
Under Ordered_map Umap2 = "Cherry", "rot", "Lime", "grün";
Umap1.Swap (UMAP2);
Under Ordered_map:: iterator iter1 = umap1.Start();
Paar pr1 = *iter1;
Under Ordered_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: LIME, 2
Erster Schlüssel und Größe von UMAP2 -Erdbeere, 4

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

Klasse und seine instanziierten Objekte

Ein Wert ist für einen Datentyp, da ein instanziiertes Objekt einer Klasse ist. Die ungeordnete Kartenkonstruktion kann auch eine Klasse als Datentyp akzeptieren. Das folgende Programm zeigt dies:

#enthalten
#enthalten
Verwenden von Namespace STD;
Klasse Thecla
öffentlich:
int num;
statischer Char Ch;
void func (char cha, const char *str)
Cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statischer void Fun (char ch)
if (ch == 'a')
Cout << "Official static member function" << '\n';

;
int main ()

Thecla obj1; Thecla obj2; Thecla obj3; Thecla obj4; Thecla obj5;
Under Ordered_map Umap;
Umap = "Banana", obj1, "Grape", obj2, "Fig", OBJ3, "Strawberry", OBJ4, "Lime", OBJ5;
Cout << umap.size() << '\n';
Rückkehr 0;

Die Ausgabe ist: 5.

Die Klassendefinition hat zwei öffentliche Mitglieder und zwei öffentliche Mitgliederfunktionen. 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 aus der Klasse besteht. Die Größe der Karte wird angezeigt. Das Programm kompiliert ohne Warn- oder Fehlermeldung.

Anwendung der Karte

Der Array assoziiert einen Index mit dem Wert. Schlüssel-/Wertpaare existieren in vielen Lebenssituationen, die programmiert werden können. Das Schlüssel-/Wertpaar von Obst/Farbe ist nur ein Beispiel. Ein weiteres Beispiel ist der Name der Menschen und deren Alter. In diesem Fall ist das Paar von einem Typ, Paar. Es kann auch Paar sein. Im letzteren Fall wird die Richtlinie zur Vorverarbeitung verwendet. Ein Schlüssel-/Wertpaar kann immer noch die Namen von verheirateten Paaren sein. In Ländern, in denen es Polygamie gibt, wird es verschiedene Frauen für einen Mann geben.

Bildung einer Karte

Eine Karte ist kein zweidimensionales Array mit zwei Spalten. Eine Karte funktioniert mit einer Hash -Funktion. Der Schlüssel wird durch die 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 Tasten werden den Indizes des Arrays zugeordnet, und so werden die Korrespondenzen zwischen Schlüssel und Werten hergestellt. Hashing ist ein umfangreiches Thema und wird in diesem Artikel nicht behandelt.

Abschluss

Eine Karte, auch als assoziatives Array bezeichnet. Jeder Schlüssel entspricht einem Wert. In C ++ wird die Karte als Datenstruktur mit Mitgliedsfunktionen und Operatoren implementiert. Eine bestellte Karte ist eine, bei der die Elementpaare von Schlüssel bestellt wurden. Eine ungeordnete Karte ist eine, bei der es keine Bestellung gibt.

Technisch gesehen besteht ein Hash aus Paarelementen. Tatsächlich ist das Paar eine ganze Datenstruktur mit seinen Mitgliedsfunktionen und Operatoren. Die beiden Vorlagenparameter für das Paar sind die gleichen zwei Template -Parameter für das uncondeded_map.

Die Initializer_List für die Karte ist ein Array -Literal von Literalen. Jedes interne Literal besteht aus zwei Objekten, dem Schlüssel-/Wertpaar,.

Die Mitgliedsfunktionen und -operatoren für nicht ordnungsgemäß_map können unter den folgenden Überschriften kategorisiert werden: unbestellted_map construction/copy constructing, uncordered_map -Kapazität, nicht ordnungsgemäße Iterator, nicht ordnungsgemäße Operationen und nicht ordnungsgemäß.

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