Namensräume
Varianten
Aktionen

std::set<Key,Compare,Allocator>::extract

Von cppreference.com
< cpp‎ | container‎ | set
 
 
 
 
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 dem von k entspricht, wird der Knoten, der dieses Element enthält, vom Container entkoppelt und ein node handle zurückgegeben, das ihn besitzt. Andernfalls wird ein leeres node handle zurückgegeben.
3) Wie (2). Diese Überladung nimmt an der Auflösung von Überladungen nur teil, wenn der qualifizierte Bezeichner Compare::is_transparent gültig ist und einen Typ bezeichnet und weder iterator noch const_iterator implizit von K konvertierbar sind. Sie ermöglicht es, diese Funktion aufzurufen, ohne eine Instanz von Key zu konstruieren.

In jedem Fall werden keine Elemente kopiert oder verschoben, sondern nur die internen Zeiger der Containerknoten werden neu ausgerichtet (Neugewichtung kann auftreten, wie bei erase()).

Das Extrahieren eines Knotens macht nur die Iteratoren zu dem extrahierten Element ungültig. Zeiger und Referenzen auf das extrahierte Element bleiben gültig, können aber nicht verwendet werden, solange das Element von einem node handle besessen wird: Sie werden verwendbar, 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 Compare-Objekt geworfen werden.

[bearbeiten] Komplexität

1) Amortisiert konstant.
2,3) log(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 <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::set<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);
}

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]