Namensräume
Varianten
Aktionen

std::unordered_multiset<Key,Hash,KeyEqual,Allocator>::extract

Von cppreference.com
 
 
 
 
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)
1) Entkoppelt den Knoten, der das von position zeigende Element enthält, und gibt ein node handle zurück, das ihn besitzt.
2) Wenn der Container ein Element mit einem Schlüssel enthält, der äquivalent zu k ist, wird der Knoten, der das erste solche Element enthält, vom Container getrennt und ein node handle zurückgegeben, der ihn besitzt. Andernfalls wird ein leeres node handle zurückgegeben.
3) Gleiche Funktionalität wie in (2). Diese Überladung nimmt an der Überladungsauflösung teil, nur wenn Hash::is_transparent und KeyEqual::is_transparent gültig sind und jeweils einen Typ bezeichnen, und weder 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

1) Wirft nichts.
2,3) Alle Ausnahmen, die vom Hash- und KeyEqual-Objekt geworfen werden.

[bearbeiten] Komplexität

1,2,3) Durchschnittlicher Fall O(1), schlimmster Fall O(size()).

[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) [edit]
fügt Elemente ein oder Knoten(seit C++17)
(public member function) [edit]
entfernt Elemente
(public member function) [edit]