Espacios de nombres
Variantes
Acciones

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::extract

De cppreference.com
 
 
 
 
node_type extract( const_iterator position );
(1) (desde C++17)
node_type extract(const Key& k );
(2) (desde C++17)
template<class K >
node_type extract( K&& x );
(3) (desde C++23)
1) Desenlaza el nodo que contiene el elemento al que apunta position y devuelve un identificador de nodo que lo posee.
2) Si el contenedor tiene un elemento con una clave equivalente a k, desenlaza el nodo que contiene ese elemento del contenedor y devuelve un identificador de nodo que lo posee. De lo contrario, devuelve un identificador de nodo vacío.
3) Igual que (2). Esta sobrecarga solo participa en la resolución de sobrecargas si Hash::is_transparent y KeyEqual::is_transparent son válidos y cada uno denota un tipo, y ni iterator ni const_iterator son convertibles implícitamente de K. Esto supone que tal Hash es invocable con el tipo K y Key, y que el KeyEqual es transparente, lo que, en conjunto, permite llamar a esta función sin construir un ejemplar de Key.

En cualquier caso, no se copia ni se mueve ningún elemento, solo se reasignan los punteros internos de los nodos del contenedor

La extracción de un nodo invalida solo los iteradores del elemento extraído , y conserva el orden relativo de los elementos que no se borran. Los punteros y las referencias al elemento extraído siguen siendo válidos, pero no se pueden utilizar mientras el elemento sea propiedad de un identificador de nodo: se vuelven utilizables si el elemento se inserta en un contenedor.

Contenido

[editar]Parámetros

position - Un iterador válido en este contenedor.
k - Una clave para identificar el nodo a extraer.
x - Un valor de cualquier tipo que pueda compararse transparentemente con una clave que identifica el nodo a ser extraído.

[editar]Valor de retorno

Un identificador de nodo que posee el elemento extraído, o un identificador de nodo vacío en caso de que el elemento no se encuentre en (2,3).

[editar]Excepciones

1) No lanza nada.
2,3) Cualquier excepción lanzada por el objeto Hash y KeyEqual.

[editar]Complejidad

1,2,3) Caso promedio O(1), en el peor de los casos O(a.size()).

[editar]Notas

extract es la única manera de cambiar una clave de un elemento de un mapa sin reasignación de memoria:

map<int, string> m{{1, "mango"}, {2, "papaya"}, {3, "guayaba"}};auto nh = m.extract(2); nh.key()=4; m.insert(move(nh));// m == {{1, "mango"}, {3, "guayaba"}, {4, "papaya"}}

[editar]Ejemplo

#include <algorithm>#include <iostream>#include <...>   int main(){std::unordered_map<int, char> cont{{1, 'a'}, {2, 'b'}, {3, 'c'}};   auto imprimir =[](std::pair<constint, char>& n){std::cout<<" "<< n.first<<'('<< n.second<<')';};   std::cout<<"Inicio:";std::for_each(cont.begin(), cont.end(), imprimir);std::cout<<'\n';   // Extraer el identificador de nodo y cambiar la claveauto nh = cont.extract(1); nh.key()=4;   std::cout<<"Después de extraer y antes de insertar:";std::for_each(cont.begin(), cont.end(), imprimir);std::cout<<'\n';   // Insertar de nueva cuenta el identificador de nodo cont.insert(move(nh));   std::cout<<"Fin:";std::for_each(cont.begin(), cont.end(), imprimir);std::cout<<'\n';}

Posible salida:

Inicio: 1(a) 2(b) 3(c) Después de extraer y antes de insertar: 2(b) 3(c) Fin: 2(b) 3(c) 4(a)

[editar]See also

(C++17)
Mueve los nodos de otro contenedor.
(función miembro pública)[editar]
(C++11)
Inserta elementos o nodos(desde C++17)
(función miembro pública)[editar]
(C++11)
Borra elementos
(función miembro pública)[editar]
close