std::unordered_multiset<Key,Hash,KeyEqual,Allocator>:: extract
|
node_type extract
(
const_iterator pos
)
;
|
(1) |
(desde C++17)
(constexpr desde C++26) |
|
node_type extract
(
const
Key
&
k
)
;
|
(2) |
(desde C++17)
(constexpr desde C++26) |
|
template
<
class
K
>
node_type extract ( K && x ) ; |
(3) |
(desde C++23)
(constexpr desde C++26) |
Hash
y
KeyEqual
son ambos
transparentes
, y ni
iterator
ni
const_iterator
son convertibles implícitamente desde
K
. Esto asume que dicho
Hash
puede ser invocado tanto con el tipo
K
como con el tipo
Key
, y que el
KeyEqual
es transparente, lo que, en conjunto, permite llamar a esta función sin construir una instancia de
Key
.
En cualquier caso, no se copian ni mueven elementos, solo se redirigen los punteros internos de los nodos del contenedor.
Extraer un nodo solo invalida los iteradores al elemento extraído, y preserva el orden relativo de los elementos que no son borrados. Los punteros y referencias al elemento extraído permanecen válidos, pero no pueden usarse mientras el elemento es propiedad de un node handle: se vuelven utilizables si el elemento se inserta en un contenedor.
Contenidos |
Parámetros
| pos | - | un iterador válido dentro de este contenedor |
| k | - | una clave para identificar el nodo a extraer |
| x | - | un valor de cualquier tipo que pueda compararse de forma transparente con una clave que identifique el nodo a extraer |
Valor de retorno
Un node handle que posee el elemento extraído, o un node handle vacío en caso de que el elemento no se encuentre en (2,3) .
Excepciones
Hash
y
KeyEqual
.
Complejidad
Notas
extract es la única forma de sacar un objeto de solo movimiento de un conjunto:
std::set<move_only_type> s; s.emplace(...); move_only_type mot = std::move(s.extract(s.begin()).value());
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_erasure
|
202110L
|
(C++23) | Borrado heterogéneo en contenedores asociativos y contenedores asociativos no ordenados , ( 3 ) |
Ejemplo
#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); }
Salida posible:
Start: 1 2 3 After extract and before insert: 2 3 End: 2 3 4
Véase también
|
(C++17)
|
empalma nodos de otro contenedor
(función miembro pública) |
|
inserta elementos
o nodos
(desde C++17)
(función miembro pública) |
|
|
elimina elementos
(función miembro pública) |