std::map<Key,T,Compare,Allocator>::extract
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) |
position y devuelve un identificador de nodo que lo posee.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.Compare::is_transparent es válido y denota un tipo, y ni iterator ni const_iterator es implícitamente convertible de K. Permite llamar a esta función sin construir una instancia 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 (puede ocurrir un rebalanceo, como con erase())
La extracción de un nodo invalida solo los iteradores del elemento extraído . 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.
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. |
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).
Excepciones
Compare.Complejidad
a.size())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"}}
Ejemplo
#include <algorithm>
#include <iostream>
#include <...>
int main()
{
std::map<int, char> cont{{1, 'a'}, {2, 'b'}, {3, 'c'}};
auto imprimir = [](std::pair<const int, 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 clave
auto 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';
}
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)
