std::unordered_multiset<Key,Hash,KeyEqual,Allocator>::extract
| node_type extract( const_iterator position ); |
(1) | (seit C++17) |
| node_type extract( const Key& k ); |
(2) | (seit C++17) |
template< class K > node_type extract( K&& x ); |
(3) | (seit C++23) |
iterator noch const_iterator von K implizit konvertierbar sind. Dies setzt voraus, dass ein solches Hash sowohl mit den Typen K als auch Key aufrufbar ist und dass KeyEqual transparent ist, was zusammen das Aufrufen dieser Funktion ohne die Erzeugung einer Instanz von Key ermöglicht.In beiden Fällen werden keine Elemente kopiert oder verschoben, sondern nur die internen Zeiger der Container-Knoten neu ausgerichtet.
Das Extrahieren eines Knotens macht nur die Iteratoren auf das extrahierte Element ungültig und bewahrt die relative Reihenfolge der nicht gelöschten Elemente. Zeiger und Referenzen auf das extrahierte Element bleiben gültig, können aber nicht verwendet werden, während das Element von einem Node-Handle gehalten wird: Sie werden nutzbar, wenn das Element in einen Container eingefügt wird.
Inhalt |
[bearbeiten] Parameter
| position | - | ein gültiger Iterator in diesen Container |
| k | - | ein Schlüssel zum Identifizieren des zu extrahierenden Knotens |
| x | - | ein Wert eines beliebigen Typs, der transparent mit einem Schlüssel verglichen werden kann, der den zu extrahierenden Knoten identifiziert |
[bearbeiten] Rückgabewert
Ein node handle, das das extrahierte Element besitzt, oder ein leeres node handle, falls das Element in (2,3) nicht gefunden wird.
[bearbeiten] Ausnahmen
Hash- und KeyEqual-Objekt geworfen werden.[bearbeiten] Komplexität
[bearbeiten] Hinweise
extract ist der einzige Weg, ein nur verschiebbares Objekt aus einem Set zu entnehmen.
std::set<move_only_type> s; s.emplace(...); move_only_type mot = std::move(s.extract(s.begin()).value());
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_erasure |
202110L |
(C++23) | Heterogene Löschung in assoziiativen Containern und nicht geordneten assoziativen Containern, (3) |
[bearbeiten] Beispiel
#include <algorithm> #include <iostream> #include <string_view> #include <unordered_set> void print(std::string_view comment, const auto& data) { std::cout << comment; for (auto datum : data) std::cout << ' ' << datum; std::cout << '\n'; } int main() { std::unordered_multiset<int> cont{1, 2, 3}; print("Start:", cont); // Extract node handle and change key auto nh = cont.extract(1); nh.value() = 4; print("After extract and before insert:", cont); // Insert node handle back cont.insert(std::move(nh)); print("End:", cont); }
Mögliche Ausgabe
Start: 1 2 3 After extract and before insert: 2 3 End: 2 3 4
[bearbeiten] Siehe auch
| (C++17) |
fügt Knoten aus einem anderen Container zusammen (public member function) |
| fügt Elemente ein oder Knoten(seit C++17) (public member function) | |
| entfernt Elemente (public member function) |