std::multimap<Key,T,Compare,Allocator>:: extract
|
node_type extract
(
const_iterator pos
)
;
|
(1) |
(seit C++17)
(constexpr seit C++26) |
|
node_type extract
(
const
Key
&
k
)
;
|
(2) |
(seit C++17)
(constexpr seit C++26) |
|
template
<
class
K
>
node_type extract ( K && x ) ; |
(3) |
(seit C++23)
(constexpr seit C++26) |
Compare
transparent
ist und weder
iterator
noch
const_iterator
implizit von
K
konvertierbar ist. Dies ermöglicht den Aufruf dieser Funktion ohne eine Instanz von
Key
zu konstruieren.
In beiden Fällen werden keine Elemente kopiert oder verschoben, nur die internen Zeiger der Container-Knoten werden neu ausgerichtet (Rebalancing kann auftreten, wie bei erase() ).
Das Extrahieren eines Knotens invalidisiert nur die Iteratoren auf das extrahierte Element. Zeiger und Referenzen auf das extrahierte Element bleiben gültig, können jedoch nicht verwendet werden, während das Element im Besitz eines Knoten-Handles ist: Sie werden wieder verwendbar, wenn das Element in einen Container eingefügt wird.
Inhaltsverzeichnis |
Parameter
| pos | - | ein gültiger Iterator in diesem Container |
| k | - | ein Schlüssel zur Identifizierung des zu extrahierenden Knotens |
| x | - | ein Wert beliebigen Typs, der transparent mit einem Schlüssel verglichen werden kann, der den zu extrahierenden Knoten identifiziert |
Rückgabewert
Ein Node Handle , das das extrahierte Element besitzt, oder ein leerer Node Handle, falls das Element in (2,3) nicht gefunden wurde.
Exceptions
Compare
-Objekt geworfen werden.
Komplexität
Hinweise
extract ist die einzige Möglichkeit, den Schlüssel eines Kartenelements ohne Neuzuweisung zu ändern:
std::map<int, std::string> m{{1, "mango"}, {2, "papaya"}, {3, "guava"}}; auto nh = m.extract(2); nh.key() = 4; m.insert(std::move(nh)); // m == {{1, "Mango"}, {3, "Guave"}, {4, "Papaya"}}
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_erasure
|
202110L
|
(C++23) | Heterogenes Löschen in assoziativen Containern und ungeordneten assoziativen Containern , ( 3 ) |
Beispiel
#include <algorithm> #include <iostream> #include <string_view> #include <map> void print(std::string_view comment, const auto& data) { std::cout << comment; for (auto [k, v] : data) std::cout << ' ' << k << '(' << v << ')'; std::cout << '\n'; } int main() { std::multimap<int, char> cont{{1, 'a'}, {2, 'b'}, {3, 'c'}}; print("Start:", cont); // Extract node handle and change key auto nh = cont.extract(1); nh.key() = 4; print("After extract and before insert:", cont); // Insert node handle back cont.insert(std::move(nh)); print("End:", cont); }
Ausgabe:
Start: 1(a) 2(b) 3(c) After extract and before insert: 2(b) 3(c) End: 2(b) 3(c) 4(a)
Siehe auch
|
(C++17)
|
verbindet Knoten aus einem anderen Container
(öffentliche Elementfunktion) |
|
fügt Elemente ein
oder Knoten
(seit C++17)
(öffentliche Elementfunktion) |
|
|
löscht Elemente
(öffentliche Elementfunktion) |