C++

Eindeutige und geordnete Container in C++

Eindeutige und geordnete Container in C++
6, 10, 2, 8, 4 ist ein Satz; 2, 4, 6, 8, 10 ist eine Menge derselben ganzen Zahlen, die in aufsteigender Reihenfolge angeordnet sind. In der Mathematik hat eine Menge eindeutige Elemente (eindeutige Elemente), d. h., kein Element kommt mehr als einmal vor. Außerdem ist eine Multimenge eine Menge, in der jedes Element mehr als einmal vorkommen kann. 6, 6, 10, 2, 2, 8, 4, 4, 4 ist eine Multimenge. 2, 2, 4, 4, 4, 6, 6, 8, 10 ist dieselbe Multimenge, jedoch mit aufsteigender Anordnung der Elemente. Dieser Artikel befasst sich nicht mit Multiset. Es befasst sich mit der C++-Datenstruktur namens set.

Eine Map in Software ist wie ein Array, aber es ist ein Array mit zwei Spalten statt einer. Die erste Spalte enthält die Schlüssel und die zweite Spalte enthält die Werte. Jede Zeile ist ein Paar, was ein Schlüssel/Wert-Paar ergibt. Ein Schlüssel steht in direktem Zusammenhang mit seinem Wert.

Ein Beispiel für eine Karte ist 'c',30, 'b',20, 'd',30, 'e',40, 'a',10. Das erste hier eingefügte Schlüssel/Wert-Paar ist 'c',3, wobei 'c' der Schlüssel und 30 der Wert ist. Diese Karte ist nicht nach Schlüsseln sortiert. Das Ordnen dieser Karte nach Schlüsseln ergibt 'a',10, 'b',20, 'c',30, 'd',30, 'e',40. Beachten Sie, dass es duplizierte Werte geben kann, aber keine duplizierten Schlüssel. Eine geordnete Karte ist eine nach Schlüsseln geordnete Karte.

Ein Multiset gehört zu einem Set, wie eine Multimap zu einer Karte. Das bedeutet, dass es Karten mit doppelten Schlüsseln gibt. Ein Beispiel für eine Multimap ist 'a',10, 'b',20, 'b',20, 'c',30, 'c',30, 'd ',30, 'e',40. Und wie oben erwähnt, befasst sich dieser Artikel nicht mit Multimap, sondern mit der C++-Datenstruktur namens map.

In C++ ist eine Datenstruktur eine Struktur mit Eigenschaften (Datenmember) und Methoden (Memberfunktionen). Die Daten der Struktur sind eine Liste; eine Menge ist eine Liste; eine Map ist eine Liste von Schlüssel/Wert-Paaren.

Dieser Artikel behandelt die Grundlagen von Mengen und Maps in C++, und um diesen Artikel besser zu verstehen, sollte der Leser über Grundkenntnisse in C . verfügen++.

Artikelinhalt:

Klasse und ihre Objekte:

In C++ werden die Menge, die Karte und andere ähnliche Strukturen als Container bezeichnet. Eine Klasse ist eine verallgemeinerte Einheit mit Datenmembern, bei denen es sich um Variablen handelt, und Memberfunktionen, die in Beziehung stehen. Wenn Datenmembern Werte zugewiesen werden, wird ein Objekt gebildet. Ein Objekt wird jedoch in einem Prozess namens Instanziierung gebildet. Da eine Klasse zu unterschiedlichen Werten für dieselben Datenelementvariablen führen kann, können dann verschiedene Objekte aus derselben Klasse instanziiert werden.

In C++ ist eine unbrauchbare Menge eine Klasse sowie eine unbrauchbare Map. Wenn ein Objekt aus der unbrauchbaren Menge oder der unbrauchbaren Karte instanziiert wird, wird das Objekt zur echten Datenstruktur. Bei den Datenstrukturen set und map ist das Hauptdatenelement eine Liste. Nun, die Menge und die Karte bilden eine Gruppe von Containern, die als geordnete assoziative Container bezeichnet werden. Ungeordnetes Set und die ungeordnete Karte gibt es auch, aber diese werden in diesem Artikel leider nicht behandelt.

Erstellen eines Sets oder einer Karte:

Das Instanziieren einer Menge aus ihrer Mengenklasse erzeugt eine Menge; Das Instanziieren einer Karte aus ihrer Kartenklasse ist das Erstellen einer Karte. Das so erstellte Objekt erhält einen Namen nach Wahl des Programmierers.

Um ein Set zu erstellen, sollte das Programm beginnen mit:

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

Beachten Sie die Direktive „#include ”, die die Set-Bibliothek enthält, die die Set-Klasse enthält, aus der die Set-Datenstrukturen instanziiert werden.

Um eine Karte zu erstellen, sollte das Programm beginnen mit:

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

Beachten Sie die Direktive „#include “, die die Kartenbibliothek enthält, die die Kartenklasse hat, aus der Kartendatenstrukturen instanziiert werden.

Die Syntax zum Erstellen eines leeren Sets lautet:

einstellen Objektname

Beispiel:

einstellen setObj;

Ein Beispiel zum Erstellen eines Sets mit Inhalt ist:

einstellen setObj(6, 10, 2, 8, 4);

Die Syntax zum Erstellen einer leeren Karte lautet:

Karte Objektname

Beispiel:

Karte mapObj;

Ein Beispiel zum Erstellen einer Karte mit Inhalt ist:

Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);

Iterator-Grundlagen:

Ein Iterator ist ein ausgearbeiteter Zeiger, mit dem die Liste der Datenstruktur vom Anfang bis zum Ende durchlaufen werden kann.

Die begin()-Memberfunktion

Die Memberfunktion begin() gibt einen Iterator zurück, der auf das erste Element der Liste zeigt. Das folgende Beispiel veranschaulicht dies für das Set:

einstellen setObj(6, 10, 2, 8, 4);
einstellen::iterator iter = setObj.Start();
cout << *iter << '\n';

Beachten Sie, wie begin() mit setObj und dem Punktoperator verwendet wurde. iter ist das zurückgegebene Iterator-Objekt. Beachten Sie auch, wie es deklariert wurde. * ist der Indirektionsoperator. Wie mit iter verwendet, gibt es das erste Element der Menge zurück; das erste Element ist 2 statt 6 - siehe Erklärung unten.

Das folgende Beispiel veranschaulicht die Verwendung der begin()-Funktion für die Karte:

Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
Karte::iterator iter = mapObj.Start();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Beachten Sie, wie begin() mit mapObj und dem Punktoperator verwendet wurde. iter ist das zurückgegebene Iterator-Objekt. Beachten Sie auch, wie es deklariert wurde. „erster“, wie hier verwendet, bezieht sich auf den Schlüssel. „Sekunde“ bezieht sich auf den dem Schlüssel entsprechenden Wert. Beobachten Sie, wie sie mit iter verwendet wurden, um die Startelementkomponenten der Liste zu erhalten. Das erste Element ist a,10 anstelle von c,30 - siehe Erklärung unten.

Die „begin() const“-Memberfunktion

Die Memberfunktion „begin() const“ gibt einen Iterator zurück, der auf das erste Element der Liste zeigt, wenn die Deklaration der Menge mit const (für konstant) beginnt. Unter dieser Bedingung kann der Wert in der Liste, auf den der zurückgegebene Iterator verweist, vom Iterator nicht geändert werden. Das folgende Beispiel veranschaulicht seine Verwendung für das Set:

const set setObj(6, 10, 2, 8, 4);
einstellen::const_iterator iter = setObj.Start();
cout << *iter << '\n';

Beachten Sie, wie begin() mit setObj und dem Punktoperator verwendet wurde. Unmittelbar nach begin() wurde kein "const" eingegeben. „const“ ist jedoch der Deklaration vorangestellt. iter ist hier das zurückgegebene konstante Iterator-Objekt, das sich vom normalen Iterator unterscheidet. Beachten Sie auch, wie es deklariert wurde. * ist der Indirektionsoperator; wie mit iter verwendet, gibt es das erste Element der Menge zurück. Das erste Element ist 2 statt 6 - siehe Erklärung unten.

Das folgende Beispiel veranschaulicht die Verwendung der Funktion „begin() const“ für die Karte:

const-Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
Karte::const_iterator iter = mapObj.Start();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Beachten Sie, wie begin() mit mapObj und dem Punktoperator verwendet wurde. Unmittelbar nach begin() wurde kein "const" eingegeben. „const“ ist jedoch der Deklaration vorangestellt. iter ist hier das zurückgegebene konstante Iterator-Objekt, das sich vom normalen Iterator unterscheidet. Beachten Sie auch, wie es deklariert wurde. „erster“, wie hier verwendet, bezieht sich auf den Schlüssel; „Sekunde“, wie hier verwendet, bezieht sich auf den Wert, der der Taste entspricht. Beobachten Sie, wie sie mit iter verwendet wurden, um die Startelementkomponenten der Liste zu erhalten. Das erste Element ist a,10 anstelle von c,30 - siehe Erklärung unten.

Die end()-Memberfunktion

Die end()-Memberfunktion gibt einen Iterator zurück, der direkt nach dem Ende der Liste zeigt. Das folgende Beispiel veranschaulicht dies für das Set:

einstellen setObj(6, 10, 2, 8, 4);
einstellen::iterator iter = setObj.Ende();
cout << *iter << '\n';

Beachten Sie, wie end() mit setObj und dem Punktoperator verwendet wurde. iter ist das zurückgegebene Iterator-Objekt. Beachten Sie auch, wie es deklariert wurde. * ist der Indirektionsoperator; wie mit iter verwendet, gibt es das letzte+1 Element der Menge zurück. Auf dem Computer des Autors ist dieses letzte+1-Element 5, was nicht auf der Liste steht. Achten Sie also darauf, dieses Element nicht zu verwenden.

Das folgende Beispiel veranschaulicht die Verwendung der end()-Funktion für die Karte:

Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
Karte::iterator iter = mapObj.Ende();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Beachten Sie, wie end() mit mapObj und dem Punktoperator verwendet wurde. iter ist das zurückgegebene Iterator-Objekt. Beachten Sie auch, wie es deklariert wurde. * ist der Indirektionsoperator; wie mit iter verwendet, gibt es das letzte+1 Element der Karte zurück. Auf dem Computer des Autors ist dieses letzte+1-Element ,0, das nicht in der Liste enthalten ist. Achten Sie also darauf, dieses Element nicht zu verwenden.

Die „end() const“-Memberfunktion

Die Memberfunktion „end() const“ gibt einen Iterator zurück, der direkt nach dem Ende der Liste zeigt, wenn die Deklaration der Menge mit const (für konstant) beginnt. Unter dieser Bedingung kann der Wert in der Liste, auf den der zurückgegebene Iterator verweist, vom Iterator nicht geändert werden. Das folgende Beispiel veranschaulicht seine Verwendung für das Set:

const set setObj(6, 10, 2, 8, 4);
einstellen::const_iterator iter = setObj.Ende();
cout << *iter << '\n';

Beachten Sie, wie end() mit setObj und dem Punktoperator verwendet wurde. Es wurde kein "const" direkt nach dem Ende eingegeben (). „const“ ist jedoch der Deklaration vorangestellt. iter ist das zurückgegebene Iterator-Objekt. Beachten Sie auch, wie es deklariert wurde. * ist der Indirektionsoperator; wie mit iter verwendet, gibt es das letzte+1 Element der Menge zurück.

Das folgende Beispiel veranschaulicht die Verwendung der Funktion „end() const“ für die Karte:

const-Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
Karte::const_iterator iter = mapObj.Ende();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Beachten Sie, wie end() mit mapObj und dem Punktoperator verwendet wurde. Es wurde kein "const" direkt nach dem Ende eingegeben (). „const“ ist jedoch der Deklaration vorangestellt. iter ist das zurückgegebene konstante Iterator-Objekt, das sich vom normalen Iterator unterscheidet. Beachten Sie auch sorgfältig die Art und Weise, wie es deklariert wurde.

Elementzugriff für Set und Karte:

einstellen

Mit der Menge wird das Element mit dem Indirektionsoperator gelesen. Die ersten beiden Elemente einer Menge werden im folgenden Beispiel gelesen:

einstellen setObj(6, 10, 2, 8, 4);
einstellen::iterator iter = setObj.Start();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Die Ausgabe ist 2, gefolgt von 4 - siehe Erklärung unten. Um auf das nächste Element der Liste zu zeigen, wird der Iterator inkrementiert.

Hinweis: Ein Element kann nicht mit dem Indirektionsoperator für die Menge geändert werden. Beispiel: „*iter = 9;“ Ist nicht möglich.

Karte

Eine Map besteht aus Schlüssel/Wert-Paaren. Ein Wert kann mit der entsprechenden Taste gelesen und mit derselben Taste geändert werden. Das folgende Codesegment veranschaulicht dies:

Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
cout << mapObj['b'] << '\n';
mapObj['b'] = 55;
cout << mapObj['b'] << '\n';

Die Ausgabe ist:

20
55

Der Punktoperator wurde hier nicht verwendet. Stattdessen wurde der Operator in eckigen Klammern verwendet, der den Schlüssel als Inhalt annimmt.

Reihenfolge der Elemente in einem Set oder einer Karte:

Elemente können in beliebiger Reihenfolge in ein Set eingefügt werden. Nach dem Einfügen ordnet die Menge jedoch ihre Elemente in aufsteigender Reihenfolge neu an. Aufsteigende Reihenfolge ist die Standardreihenfolge. Wenn eine absteigende Reihenfolge benötigt wird, muss die Menge wie im folgenden Beispiel deklariert werden:

einstellen > setObj(6, 10, 2, 8, 4);

Also, nach dem Typ, e.G., int, für die Vorlage steht ein Komma, gefolgt von „größer“” in den spitzen Klammern.

Elemente können in beliebiger Reihenfolge in eine Karte eingefügt werden. Nach dem Einfügen ordnet die Karte ihre Elemente jedoch (nur) in aufsteigender Reihenfolge nach Schlüssel an, während die Beziehung zwischen jedem Schlüssel und seinem Wert beibehalten wird. Aufsteigende Reihenfolge ist die Standardreihenfolge; Wenn eine absteigende Reihenfolge benötigt wird, muss die Karte wie im folgenden Beispiel deklariert werden:

Karte > mapObj('c',30,'b',20,'d',30,'e',40,'a',10);

Also, nach dem Typpaar, e.G., „char, int“, für die Vorlage steht ein Komma, gefolgt von „größer“” in den spitzen Klammern.

Durchqueren eines Satzes

Die while-Schleife oder for-Schleife mit dem Iterator kann verwendet werden, um eine Menge zu durchlaufen. Im folgenden Beispiel wird eine for-Schleife verwendet, um eine Menge zu durchlaufen, die in absteigender Reihenfolge konfiguriert wurde:

einstellen > setObj(6, 10, 2, 8, 4);
für (set::iterator iter = setObj.Start(); iter != setObj.Ende(); ++iter)

cout << *iter << ";

Die Ausgabe ist:

10 8 6 4 2

Das Inkrementieren eines Iterators führt ihn zum nächsten Element.

Eine Karte durchqueren

Die while-Schleife oder for-Schleife mit dem Iterator kann verwendet werden, um eine Karte zu durchqueren. Im folgenden Beispiel wird eine for-Schleife verwendet, um eine Karte zu durchlaufen, die in absteigender Reihenfolge konfiguriert wurde:

Karte > mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
für (Karte::iterator iter = mapObj.Start(); iter != mapObj.Ende(); ++iter)

cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Die Ausgabe ist:

e, 40, d, 30, c, 30, b, 20, a, 10,

Das Inkrementieren eines Iterators führt ihn zum nächsten Element. „first“ im Code bezieht sich auf den Schlüssel und „second“ auf den entsprechenden Wert. Beachten Sie, wie diese Werte für die Ausgabe erhalten wurden.

Andere häufig verwendete Memberfunktionen:

Die size() Funktion

Diese Funktion gibt eine ganze Zahl zurück, die die Anzahl der Elemente in der Liste ist. Beispiel einstellen:

einstellen > setObj(6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

Die Ausgabe ist 5.

Kartenbeispiel:

Karte > mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
cout << mapObj.size() << '\n';

Die Ausgabe ist 5.

Die insert()-Funktion

einstellen

Set erlaubt keine Duplikate. Jedes eingefügte Duplikat wird also stillschweigend abgelehnt. Bei der Menge ist das Argument der Funktion insert() der einzufügende Wert. Der Wert wird an einer Position eingepasst, in der die Reihenfolge im Satz aufsteigend oder absteigend bleibt. Beispiel:

einstellen setObj(6, 10, 2, 8, 4);
setObj.einfügen(6);
setObj.einfügen (9);
setObj.einfügen (12);
für (set::iterator iter = setObj.Start(); iter != setObj.Ende(); ++iter)

cout << *iter << ";

Die Ausgabe ist:

2 4 6 8 9 10 12

Hinweis: Die Elementfunktion insert() kann verwendet werden, um eine leere Menge zu füllen.

Karte

Karte erlaubt kein Duplizieren nach Schlüssel. Jedes eingefügte Duplikat wird also stillschweigend abgelehnt. Bei der Map ist das Argument für die Funktion insert() das Schlüssel/Wert-Paar in geschweiften Klammern. Das Element wird per Schlüssel in eine Position eingepasst, in der die Reihenfolge in der Karte aufsteigend oder absteigend bleibt. Beispiel:

Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
KarteObj.insert('e',80);
KarteObj.insert('f',50);
KarteObj.insert('g',60);
für (Karte::iterator iter = mapObj.Start(); iter != mapObj.Ende(); ++iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Die Ausgabe ist:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

Hinweis: Die Memberfunktion insert() kann verwendet werden, um eine leere Karte zu füllen.

Die empty() Funktion

Diese Funktion gibt true zurück, wenn die Liste leer ist, andernfalls false. Beispiel einstellen:

einstellen setObj(6, 10, 2, 8, 4);
bool ret = setObj.leer();
cout << ret << '\n';

Die Ausgabe ist 0 für false, was bedeutet, dass die Menge hier nicht leer ist.

Kartenbeispiel:

Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
bool ret = mapObj.leer();
cout << ret << '\n';

Die Ausgabe ist 0 für false, was bedeutet, dass die Karte hier nicht leer ist.

Die delete()-Funktion

einstellen

Betrachten Sie das folgende Codesegment:

einstellen setObj(10, 20, 30, 40, 50);
einstellen::iterator iter = setObj.Start();
einstellen::iterator itr = setObj.löschen(iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.löschen(itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Die Ausgabe ist:

neue Größe: 4
nächster Wert: 20
neue Größe: 3
nächster Wert: 30

Die Funktion delete() nimmt als Argument einen Iterator, der auf ein Element zeigt. Nach dem Löschen des Elements gibt die Funktion delete() einen Iterator zurück, der auf das nächste Element zeigt.

Karte

Betrachten Sie das folgende Codesegment:

Karte mapObj('a',10,'b',20,'c',30,'d',40,'e',50);
Karte::iterator iter = mapObj.Start();
Karte::iterator itr = mapObj.löschen (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.löschen(itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Die Ausgabe ist:

neue Größe: 4
nächstes Wertepaar: b,20
neue Größe: 3
nächstes Wertepaar: c,30

Die Funktion delete() nimmt als Argument einen Iterator, der auf ein Element zeigt. Nach dem Löschen des Elements gibt die Funktion delete() einen Iterator zurück, der auf das nächste Element zeigt.

Die clear()-Funktion

Die Funktion clear() entfernt alle Elemente in der Liste. Beispiel einstellen:

einstellen setObj(6, 10, 2, 8, 4);
setObj.klar();
cout << setObj.size() << '\n';

Die Ausgabe ist 0.

Kartenbeispiel:

Karte mapObj('c',30,'b',20,'d',30,'e',40,'a',10);
KarteObj.klar();
cout << mapObj.size() << '\n';

Die Ausgabe ist 0.

Fazit:

Eine Satzdatenstruktur in C++ ist eine Struktur, in der die Liste der Elemente standardmäßig in aufsteigender Reihenfolge oder nach Wahl des Programmierers in absteigender Reihenfolge gespeichert wird. Alle Elemente des Sets sind einzigartig. Eine Map-Datenstruktur in C++ ist eine Struktur, in der die Liste ein Hash von Schlüssel/Wert-Paaren ist, die standardmäßig in aufsteigender Reihenfolge der Schlüssel oder nach Wahl des Programmierers in absteigender Reihenfolge der Schlüssel gespeichert sind. Die Schlüssel sind auch eindeutig und es können doppelte Werte vorkommen. Das Hauptdatenelement jeder der Strukturen ist die Liste. Jede Struktur hat Memberfunktionen, von denen einige häufig verwendet werden.

Vulkan für Linux-Benutzer
Mit jeder neuen Grafikkartengeneration stoßen Spieleentwickler an die Grenzen der grafischen Wiedergabetreue und kommen dem Fotorealismus einen Schrit...
OpenTTD vs. Simutrans
Das Erstellen einer eigenen Transportsimulation kann Spaß machen, entspannend und äußerst verlockend sein. Deshalb sollten Sie so viele Spiele wie mög...
OpenTTD-Tutorial
OpenTTD ist eines der beliebtesten Wirtschaftssimulationsspiele auf dem Markt. In diesem Spiel musst du ein wunderbares Transportunternehmen aufbauen....