Wann verwende ich node_type mit std :: map :: insert?

8

Ich bin an die bestehende Schnittstelle von std::map gewöhnt.
Das Einfügen von Elementen gibt ein Bool zurück, das eine erfolgreiche Einfügung beschreibt sowie der Iterator, wo das eingefügte Element wäre.

%Vor%

C ++ 17 fügt etwas hinzu, das wie ein ähnlicher Aufruf aussieht, aber mit anderen Typnamen:

%Vor%

Ich habe versucht herauszufinden, was ein node_type ist, aber es ist in erster Linie nicht spezifiziert:

%Vor%

Warum wurde diese Funktion in C ++ 17 hinzugefügt und wann würde ich sie über den älteren Aufruf verwenden?

    
Trevor Hickey 10.09.2016, 05:54
quelle

2 Antworten

7

Es ist nicht nur std::map , ähnliche Funktionen wurden allen assoziativen und ungeordneten assoziativen Containern hinzugefügt. Sie werden im Standard in [container.node] / 1

  

Ein Node Handle ist ein Objekt, das den Besitz eines einzelnen Elements aus einem assoziativen Container (23.2.4) oder einem ungeordneten assoziativen Container (23.2.5) akzeptiert. Es kann verwendet werden, um dieses Eigentum auf einen anderen Container zu übertragen   mit kompatiblen Knoten. Container mit kompatiblen Knoten haben denselben Knoten-Handle-Typ. ...

Die Tabelle nach dem obigen Abschnitt zeigt die Container mit kompatiblen Knoten.

Mit der Node-Handle-Schnittstelle können Sie Elemente (Knoten) von einem Container in einen anderen (kompatiblen) Container übertragen, ohne die Elemente kopieren / verschieben zu müssen. Stattdessen werden die einzelnen internen Knoten, die vom Container verwaltet werden, als Ganzes übertragen.

Dies wird notwendig, wenn Sie mit einem Container arbeiten, der einen nicht kopierbaren, nicht beweglichen Typ enthält.

    
Praetorian 10.09.2016, 06:17
quelle
5

Sie können einen Knoten von einem std::map mit seiner Funktion extract () erhalten. Dann können Sie diesen Knoten in eine andere Karte einfügen (oder in dieselbe Karte, nachdem Sie den Schlüssel geändert haben).

%Vor%      

1) Löscht den Knoten, der das Element enthält, auf das die Position zeigt   und gibt ein Node-Handle zurück, das es besitzt   2) Wenn der Behälter einen hat   Element mit dem Schlüssel x entkoppelt den Knoten, der enthält   Dieses Element aus dem Container und gibt ein Node-Handle zurück, das Eigentümer ist   es. Andernfalls wird ein leerer Knotenpunkt zurückgegeben.

     

In beiden Fällen werden keine Elemente kopiert oder verschoben, nur die internen   Zeiger der Container-Knoten werden neu positioniert (Rebalancing kann vorkommen,   wie beim Löschen ()) Das Extrahieren eines Knotens macht die Iteratoren für ungültig   extrahiertes Element Zeiger und Referenzen auf das extrahierte Element   bleiben gültig, können aber nicht verwendet werden, solange das Element einem Knoten gehört   handle: Sie werden benutzbar, wenn das Element in ein eingefügt wird   Container.

     

Beispiel:

%Vor%
    
Leon 10.09.2016 06:16
quelle

Tags und Links