C ++ MAP Empace

C ++ MAP Empace
In C ++ tun EMPLACE () und Insert () -Funktionen etwas Ähnliches. Wenn sich der Programmierer nicht um die Vorteile kümmert, die Emplace hat, kann er Insert () verwenden.). Emplace konstruiert das Interessenselement innerhalb des interessierenden Behälter.

Begriff kopieren

Betrachten Sie die folgenden zwei Zeichenlisten:

Liste la = 'a', 'b', 'c', 'd';
Liste lb = 'e', 'f', 'g', 'H';

'G' in LB kann in LA kopiert und vor 'D' gelegt werden, um zu haben,

Liste la = 'a', 'b', 'c', 'g', 'd';
Liste lb = 'e', 'f', 'g', 'H';

Begriff bewegen

'G' in lb kann entfernt und vor 'D' in LA platziert werden, um zu haben,

Liste la = 'a', 'b', 'c', 'g', 'd';
Liste lb = 'e', 'f', 'H';

Wert im Element

Das Kopieren und Bewegen ist nicht so stumpf wie oben gezeigt. In einer realen Situation jeder Wert (e.G., Zeichen) ist in einem Element. Wenn also eine Liste von Zeichen vier Zeichen hat, hat die Liste vier Elemente. Wenn eine Liste von Chars drei Zeichen hat, hat die Liste drei Elemente.

Ein Element kann eine Struktur mit 3 Datenmitgliedern sein. Das erste Datenelement ist ein Zeiger, der auf das vorherige Element in der Liste hinweist. Das zweite Datenmitglied hält den Wert in diesem Fall den Charakter. Das dritte Datenelement ist ein Zeiger, der auf das nächste Element in der Liste hinweist.

So würde das zweite Datenmitglied einer Struktur vom zweiten Datenmitglied wie 'G' oben gehalten. Im Fall der ursprünglichen Liste lb oben und für 'G' würde das erste Datenelement der Struktur auf das Element verweisen, das 'f' hat, und das dritte Datenelement der Struktur würde auf das Element verweisen, das hat 'h'.

Einfügen und emportieren

Wenn Insert () wie oben ausgedrückt kopieren muss, ist das Element von 'g', ich.e., Die vollständige Struktur wird theoretisch kopiert und vor dem 'D'element platziert. In der Praxis wird das dritte Datenelement der neuen G -Struktur in der Praxis als vor dem 'D' -Element platziert angesehen, um auf das' D' -Element zu verweisen. und das erste Datenmitglied der neuen G -Struktur wird darauf hingewiesen, dass sie auf das "C" -Element (von List LA) verweist.

Wenn Insert () wie oben ausgedrückt wird, wird das Kopieren, wie hier erläutert.

Emplace () hingegen muss kein Element kopieren oder verschieben. Es muss nur dem Programm angezeigt werden, dass der Wert von Interesse der Charakter "G" ist. Das Programm erstellt dann ein neues Element mit 'G' als Wert vor dem 'D'element in der Liste, LA. Das heißt, es wird eine neue 'G' -Struktur vor dem 'D' -Element erstellen, wobei das dritte Datenelement auf das 'D' -Element und das erste Datenmitglied zeigt Bauverfahren.

Der Hauptunterschied zwischen Insert () und Emplace () besteht also darin, dass Emplace () das Einfügenelement an der Stelle konstruiert, während Insert () das Element kopieren oder verschieben muss.

In diesem Artikel erklärt.

Artikelinhalt

  • Das Kartenelement
  • a_uniq.Emplace (Args)
  • A.Empace_Hint (p, Args)
  • Abschluss

Das Kartenelement

Im Folgenden finden Sie vier Fruchtnamen und ihre äußeren Farben:

Banane => Gelb
Passionsfrucht => lila
Wassermelone => grün
Traube => rosa

Eine Karte besteht aus Schlüssel-/Wertpaaren. In dieser gewöhnlichen Liste sind die Namen der Früchte die Schlüssel, und die Namen der äußeren Farben sind die Werte. Dies ist jedoch eine Liste von Paaren, nicht allein eine Liste von Werten und nicht allein eine Liste von Schlüssel. Es ist eine Liste der Schlüssel-/Wertpaare. Die Schlüssel einer Karte sind einzigartig.

In Code werden ein Schlüssel und sein Wert als Element codiert, das als Paar bezeichnet wird. Jedes Element würde von einem Iterator vermittelt werden. Ein Kartenelement sieht also einen Schlüssel als Wert, und der Schlüssel entspricht einem anderen Wert. Ein Kartenelement benötigt also zwei Werte, um ein Element zu erstellen. nicht einer, wie in der obigen Einführung ausgedrückt. Diese beiden Werte befinden sich in einem Code, das als Paar bezeichnet wird.

Die Vorlage für das Kartenelement lautet:

Paar

Der erste Parameter ist für den Schlüssel und ist als Key_Type angegeben. Der zweite Parameter ist für den Wert, der dem Schlüssel entspricht. Es ist als maped_type und nicht value_type angegeben. value_type ist eigentlich:

Paar

die Elementvorlage. Mit dem Array sind die Indizes zu Werten. Mit der Karte sind Iteratoren zu Paaren. Ein Paar ist ein Wert, der vom zweiten Datenelement einer Struktur und das dritte Datenmitglied auf das nächste Element hingewiesen werden kann, das auch ein Paar als Wert hat. und das erste Datenmitglied, das auf das vorherige Element zeigt, dessen Wert ein anderes Paar ist.

In der obigen Frucht-/Farbliste kann das erste Paar wie folgt codiert werden:

"Banane", "gelb"

"Banane" ist der Schlüssel, und "Gelb" ist der Wert, der ein Schlüssel-/Wertpaar bildet. Die gesamte Shortlist von zwei Werten ist ein Wert von Value_type und kann vom mittleren Datenelement eines Strukturelements gehalten werden. Das erste Datenelement der Struktur verweist auf das vorherige Element, und das dritte Datenelement der Struktur zeigt auf das nächste Element.

Nun ist ein Paar ein Objekt, dessen Schlüssel den Mitgliedsnamen zuerst hat und dessen Wert den Mitgliedsnamen an zweiter Stelle hat.

Das folgende Programm bringt die obige Liste der Früchte/Farben in eine Karte:

#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

Karte mp = "Banana", "gelb", "Passionsfrucht", "lila", "Watermelon", "Green", "Grape", "Pink";
für (Karte:: iterator it = mp.Start(); Es != MP.Ende(); es ++)
Cout << it->Erste << " => " << it->zweite << endl;
Rückkehr 0;

Die Ausgabe ist:

Banane => Gelb
Passionsfrucht => lila
Wassermelone => grün
Traube => rosa

Beachten Sie, dass die Kartenbibliothek enthalten sein musste.

Heterogenes Paar

Ein Paar darf nicht unbedingt einen Schlüssel und einen Wert haben, der für den normalen Benutzer sinnvoll ist. Es kann auch einen Schlüssel und einen Wert haben, der für den gewöhnlichen Benutzer keinen Sinn macht, sondern für den Programmierer sinnvoll ist. Als Beispiel für ein Schlüssel-/Wertpaar, das für den Programmierer sinnvoll ist, ist der Schlüssel möglicherweise ein Iterator und der Wert, einen Bool -Typ.

a_uniq.Emplace (Args)

Hier ist a_uniq der Name der Karte. Args sind der Schlüssel und Wert für das Paar, getrennt durch ein Komma. Die Mitgliedsfunktion gibt ein Paar zurück, dessen erster Wert ein Iterator ist (value_type); und dessen zweiter Wert ein Bool ist, um anzuzeigen, ob die Einfügung (an der Stelle gebaut) erfolgreich war (wahr für den Erfolg). Der zurückgegebene Iterator zeigt auf das eingefügte Element. Die C ++ - Spezifikation zeigt nicht an. Das folgende Programm zeigt die Verwendung der Funktion:

#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

Karte mp = "Banana", "gelb", "Passionsfrucht", "lila", "Watermelon", "Green", "Grape", "Pink";
Paar:: Iterator, bool> pr = mp.Emplace ("Strawberry", "Rot");
Cout << (pr.first)->Erste << " => " << (pr.first)->zweite << " : " << pr.second << endl;
Cout << endl;
für (Karte:: iterator it = mp.Start(); Es != MP.Ende(); es ++)
Cout << it->Erste << " => " << it->zweite << endl;
Rückkehr 0;

Die Ausgabe ist:

Erdbeere => Rot: 1
Erdbeere => Rot
Banane => Gelb
Passionsfrucht => lila
Wassermelone => grün
Traube => rosa

1 In der ersten Ausgabelinie bedeutet wahr. Beachten. Verwechseln Sie nicht zwischen Value_Type und _type _type.

A.Empace_Hint (p, Args)

Hier ist 'a' der Name der Karte. Diese Mitgliedsfunktion ähnelt der oben genannten. Es ist ein Iterator, der auf das Element vor und in der Nähe zeigt, wobei die Insertion (Einlagerung) im Gedächtnis platziert wird. Die Funktion gibt einen Iterator und kein Paar zurück. Der Iterator zeigt auf das neu eingefügte Element (Paar). Das folgende Programm zeigt dies:

#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

Karte mp = "Banana", "gelb", "Passionsfrucht", "lila", "Watermelon", "Green", "Grape", "Pink";
Karte:: Iterator p = MP.Ende();
P--;
Karte:: iterator iter = mp.emplace_hint (p, "Strawberry", "rot");
Cout << iter->Erste << " => " << iter->zweite << endl;
Cout << endl;
für (Karte:: iterator it = mp.Start(); Es != MP.Ende(); es ++)
Cout << it->Erste << " => " << it->zweite << endl;
Rückkehr 0;

Die Ausgabe ist:

Erdbeere => Rot
Erdbeere => Rot
Banane => Gelb
Passionsfrucht => lila
Wassermelone => grün
Traube => rosa

Abschluss

Empace und Insert sind ähnlich. Emplace erstellt sein Element in der Liste, nachdem er den Wert erhalten hat, irgendwie. Auf der anderen Seite kopiert das Element von irgendwoher in die Liste oder bewegt das Element von irgendwoher in die Liste.

HINWEIS: Eine Karte wird normalerweise erstellt, sortiert nach Schlüssel. Um dies für die obige Karte zu erreichen, verwenden.