TIPP:Lesen Sie zuerst das Update!
Der aktuelle C++ 11-Standard und der C++ 14-Entwurf bieten keine Memberfunktion zum Aktivieren dieser Funktion. Wie Lavr vorgeschlagen, dass Sie noch
schreiben
m.insert(make_move_iterator(begin(temp)),
make_move_iterator(end (temp)));
, die die Werte aus dem Quellbehälter in den Zielbehälter bewegt. Es werden jedoch weder die Container-Knoten noch die Schlüssel verschoben. Dies erfordert Speicherzuweisungen (zumindest für die Erstellung der neuen Knoten in der Zielkarte). Die Anzahl der Elemente im Quellcontainer bleibt gleich. Der Grund für das Kopieren ist einfach: Der Werttyp std::map
ist std::pair<const Key,T>
. Und das Verschieben von einem const Key
ist im Wesentlichen Kopieren des Schlüssels (es sei denn, jemand überlastet den Key
Konstruktor, der eine const Key &&
, für die ich keinen angemessenen Grund denke).
Wenn Sie Daten von einem Container in einen anderen verschieben müssen, können Sie die Verwendung von std::list
anstelle von std::map
in Erwägung ziehen. Es hat eine member function splice
, die die Elemente in konstanter Zeit von einer Liste zu einer anderen verschiebt.
UPDATE:
Da C++ 17 gibt es die Funktion std::map::merge()
die im Grunde alle die Elemente einer std::map
in eine andere std::map
die tatsächlichen Elemente ohne Verschieben oder Kopieren bringt, sondern durch interne Zeiger nur repointing. Es ist sehr ähnlich zu std::list::splice()
, die seit C++ 98 existiert.
So können Sie
m.merge(temp);
schreiben Ihr Ziel zu erreichen. Dies ist effizienter als das Kopieren oder Verschieben aller Elemente von einem Container zum anderen.
Aber Vorsicht! Widersprüchliche Schlüssel werden nicht aufgelöst: Bei übereinstimmenden Schlüsseln wird nichts unternommen.
Während "const Key" kopiert wird, wenn das Paar bewegt wird, und während "temp" die gleiche Anzahl von Elementen behält, wird "T" st krank sein bewegt ... also, wenn 'T' eine große Struktur mit Bewegungssemantik wie' std :: vector' ist, macht das noch Sinn, oder? – iavr
@lavr Ja, tatsächlich. –