Namespaces
Variants

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

From cppreference.net

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)
1) Entfernt den Knoten, der das von pos gezeigte Element enthält, und gibt einen node handle zurück, der diesen besitzt.
2,3) Falls der Container ein Element mit einem Schlüssel äquivalent zu k oder x (seit C++23) enthält, entfernt den Knoten, der dieses Element enthält, aus dem Container und gibt einen node handle zurück, der diesen besitzt. Andernfalls wird ein leerer node handle zurückgegeben.
3) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn Compare transparent ist und weder iterator noch const_iterator implizit von K konvertierbar ist. Dies erlaubt 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.

Ausnahmen

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

Komplexität

1) Amortisiert konstant.
2,3) log( size() )

Hinweise

extract ist die einzige Möglichkeit, ein Move-Only-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 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 <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

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)