Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: extract

From cppreference.net

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)
1) Desvincula el nodo que contiene el elemento apuntado por pos y devuelve un node handle que lo posee.
2,3) Si el contenedor tiene un elemento con clave equivalente a k o x (desde C++23) , desvincula el nodo que contiene ese elemento del contenedor y devuelve un node handle que lo posee. De lo contrario, devuelve un node handle vacío.
3) Esta sobrecarga participa en la resolución de sobrecarga solo si Compare es transparent , y ni iterator ni const_iterator son convertibles implícitamente desde K . 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 (puede ocurrir un rebalanceo, como con erase() ).

Extraer un nodo solo invalida los iteradores al elemento extraído. 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

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

Complejidad

1) Constante amortizada.
2,3) log( size() )

Notas

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

std::map<int, std::string> m{{1, "mango"}, {2, "papaya"}, {3, "guava"}};
auto nh = m.extract(2);
nh.key() = 4;
m.insert(std::move(nh));
// m == {{1, "mango"}, {3, "guava"}, {4, "papaya"}}
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 <map>
void print(std::string_view comment, const auto& data)
{
    std::cout << comment;
    for (auto [k, v] : data)
        std::cout << ' ' << k << '(' << v << ')';
    std::cout << '\n';
}
int main()
{
    std::map<int, char> cont{{1, 'a'}, {2, 'b'}, {3, 'c'}};
    print("Start:", cont);
    // Extraer manejador de nodo y cambiar clave
    auto nh = cont.extract(1);
    nh.key() = 4;
    print("After extract and before insert:", cont);
    // Insertar manejador de nodo de vuelta
    cont.insert(std::move(nh));
    print("End:", cont);
}

Salida:

Start: 1(a) 2(b) 3(c)
After extract and before insert: 2(b) 3(c)
End: 2(b) 3(c) 4(a)

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)