Espacios de nombres
Variantes
Acciones

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

De cppreference.com
< cpp‎ | container‎ | map
 
 
 
 
std::pair<iterator, bool> insert( const value_type& value );
(1)
template< class P >
std::pair<iterator, bool> insert( P&& value );
(2) (desde C++11)
std::pair<iterator, bool> insert( value_type&& value );
(3) (desde C++17)
(4)
iterator insert( iterator hint, const value_type& value );
(hasta C++11)
iterator insert( const_iterator hint, const value_type& value );
(desde C++11)
template< class P >
iterator insert( const_iterator hint, P&& value );
(5) (desde C++11)
iterator insert( const_iterator hint, value_type&& value );
(6) (desde C++17)
template< class InputIt >
void insert( InputIt first, InputIt last );
(7)
void insert( std::initializer_list<value_type> ilist );
(8) (desde C++11)
insert_return_type insert( node_type&& nh );
(9) (desde C++17)
iterator insert( const_iterator hint, node_type&& nh );
(10) (desde C++17)

Inserta uno o varios elementos en el contenedor, si el contenedor aún no contiene un elemento con una clave equivalente.

1-3) Inserta value. La sobrecarga (2) es equivalente a emplace(std::forward<P>(value)) y solo participa en la resolución de sobrecargas si std::is_constructible<value_type, P&&>::value == true.
4-6) Inserta value en la posición lo más cerca posible, justo antes(desde C++11) de hint. La sobrecarga (5) es equivalente a emplace_hint(hint, std::forward<P>(value)) y solo participa en la resolución de sobrecargas si std::is_constructible<value_type, P&&>::value == true.
7) Inserta elementos del rango [first, last). Si varios elementos en el rango tienen claves que se comparan equivalentes, no se especifica qué elemento se inserta (pendiente de la resolución de LWG2844).
8) Inserta elementos de la lista de inicializadores ilist. Si varios elementos en el rango tienen claves que se comparan equivalentes, no se especifica qué elemento se inserta (pendiente de la resolución de LWG2844).
9) Si nh es un identificador de nodo vacío, no hace nada. De lo contrario, inserta el elemento propiedad de nh en el contenedor, si el contenedor no contiene ya un elemento con una clave equivalente a nh.key(). El comportamiento no está definido si nh no está vacío y get_allocator() != nh.get_allocator().
10) Si nh es un identificador de nodo vacío, no hace nada y devuelve el iterador al final. De lo contrario, inserta el elemento propiedad de nh en el contenedor, si el contenedor no contiene ya un elemento con una clave equivalente a nh.key(), y devuelve el iterador que apunta al elemento con clave equivalente a nh.key() ((independientemente de si la inserción se realizó correctamente o no). Si la inserción se realiza correctamente, nh se mueve; de ​​lo contrario, conserva la propiedad del elemento. El elemento se inserta lo más cerca posible de la posición justo antes de hint. El comportamiento no está definido si nh no está vacío y get_allocator() != nh.get_allocator().

No se invalidan ni referencias ni iteradores. Si la inserción tiene éxito, se invalidan los punteros y las referencias al elemento obtenido mientras se alberga en el identificador de nodo (node handle), y los punteros y las referencias obtenidas para ese elemento antes que se extrajera se vuelven válidas. (desde C++17)

Contenido

[editar] Parámetros

hint -
El iterador usado como una sugerencia de dónde iniciar la búsqueda. (hasta C++11)
El iterador a la posición antes de la cual se insertará el nuevo elemento. (desde C++11)
value - El valor del elemento a insertar.
first, last - El rango de los elementos a insertar.
ilist - La lista de inicializadores a partir de la cual insertar los valores.
nh - Un identificador de nodo compatible.
Requisitos de tipo
-
InputIt debe satisfacer los requisitos de InputIterator.

[editar] Valor de retorno

1-3) Devuelve un std::pair que consiste en un iterador al elemento insertado (o al elemento que impidió la inserción) y un valor bool establecido en true si la inserción tuvo lugar.
4-6) Devuelve un iterador al elemento insertado, o al elemento que impidió la inserción.
7-8) (Ninguno)
9) Devuelve un insert_return_type con los miembros inicializados de la siguiente manera:
  • Si nh está vacío, inserted es false, position es end(), y node está vacío.
  • De lo contrario, si la inserción tomó lugar, inserted es true, position apunta al elemento insertado, y node está vacío.
  • Si la inserción falló, inserted es false, node tiene el valor anterior de nh, y position apunta a un elemento con una clave equivalente a nh.key().
10) Un iterador al final si nh estaba vacío, un iterador que apunta al elemento insertado si la inserción tomó lugar, y un iterador que apunta a un elemento con una clave equivalente a nh.key() si falló.

[editar] Excepciones

1-6) Si se lanza una excepción por cualquier operación, la inserción no surte efecto.

[editar] Complejidad

1-3) Logarítmica en el tamaño del contenedor, O(log(size())).
4-6) Constante amortizada si la inserción ocurre en la posición justo después de la pista, logarítmica en el tamaño del contenedor de lo contrario.
(hasta C++11)
4-6) Constante amortizada si la inserción ocurre en la posición justo antes de la pista, logarítmica en el tamaño del contenedor de lo contrario.
(desde C++11)
7-8) O(N*log(size() + N)), donde N es el número de elementos a insertar.
9) Logarítmica en el tamaño del contenedor, O(log(size())).
10) Constante amortizada si la inserción ocurre en la posición justo antes de la pista, logarítmica en el tamaño del contenedor de lo contrario.

[editar] Notas

La inserción con pista o sugerencia (4-6) no devuelve un valor booleano para ser compatible con la signatura de la inserción posicional en contenedores secuenciales, como std::vector::insert. Esto hace posible crear insertadores genéricos como std::inserter. Una forma de comprobar el éxito de una inserción con pista o sugerencia es comparar size() antes y después.

[editar] Ejemplo

El siguiente código demuestra las distintas formas de inserción utilizando sobrecargas con un ejemplo de alturas de jugadores de Karasuno:

#include <iomanip>
#include <iostream>
#include <map>
#include <string>
 
using namespace std::literals;
 
template<typename It>
void imprimir_estatus_de_insercion(It it, bool exito)
{
    std::cout << "Inserción de " << it->first << (exito ? " tuvo éxito\n" : " falló\n");
}
 
int main()
{
    std::map<std::string, float> alt_jugadores_karasuno;
 
    // Sobrecarga 3: insertar de una referencia a r-valor
    const auto [it_hinata, exito] = alt_jugadores_karasuno.insert({"Hinata"s, 162.8});
    imprimir_estatus_de_insercion(it_hinata, exito);
 
    {
        // Sobrecarga 1: insertar de una referencia a l-valor
        const auto [it, exito2] = alt_jugadores_karasuno.insert(*it_hinata);
        imprimir_estatus_de_insercion(it, exito2);
    }
    {
        // Sobrecarga 2: insertar vía reenvío para emplazar
        const auto [it, exito] = alt_jugadores_karasuno.insert(std::pair{"Kageyama", 180.6});
        imprimir_estatus_de_insercion(it, exito);
    }
 
    {
        // Sobrecarga 6: insertar de una referencia a r-valor con pista posicional
        const std::size_t n = std::size(alt_jugadores_karasuno);
        const auto it = alt_jugadores_karasuno.insert(it_hinata, {"Azumane"s, 184.7});
        imprimir_estatus_de_insercion(it, std::size(alt_jugadores_karasuno) != n);
    }
    {
        // Sobrecarga 4: insertar de una referencia a l-valor con pista posicional
        const std::size_t n = std::size(alt_jugadores_karasuno);
        const auto it = alt_jugadores_karasuno.insert(it_hinata, *it_hinata);
        imprimir_estatus_de_insercion(it, std::size(alt_jugadores_karasuno) != n);
    }
    {
        // Sobrecarga 5: insertar vía reenvío para emplazar con pista posicional
        const std::size_t n = std::size(alt_jugadores_karasuno);
        const auto it = alt_jugadores_karasuno.insert(it_hinata, std::pair{"Tsukishima", 188.3});
        imprimir_estatus_de_insercion(it, std::size(alt_jugadores_karasuno) != n);
    }
 
    auto nodo_hinata = alt_jugadores_karasuno.extract(it_hinata);
    std::map<std::string, float> alt_jugadores;
 
    // Sobrecarga 7: insertar de rango de iteradores
    alt_jugadores.insert(std::begin(alt_jugadores_karasuno), std::end(alt_jugadores_karasuno));
 
    // Sobrecarga 8: insertar de lista de inicializadores
    alt_jugadores.insert({{"Kozume"s, 169.2}, {"Kuroo", 187.7}});
 
 
    // Sobrecarga 9: insertar nodo
    const auto status = alt_jugadores.insert(std::move(nodo_hinata));
    imprimir_estatus_de_insercion(status.position, status.inserted);
 
    nodo_hinata = alt_jugadores.extract(status.position);
    {
        // Sobrecarga 10: insertar nodo con pista posicional
        const std::size_t n = std::size(alt_jugadores);
        const auto it = alt_jugadores.insert(std::begin(alt_jugadores), std::move(nodo_hinata));
        imprimir_estatus_de_insercion(it, std::size(alt_jugadores) != n);
    }
 
 
    // Imprimir map resultante
    std::cout << std::left << '\n';
    for (const auto& [nombre, altura] : alt_jugadores)
        std::cout << std::setw(10) << nombre << " | " << altura << "cm\n";
}

Salida:

Inserción de Hinata tuvo éxito
Inserción de Hinata falló
Inserción de Kageyama tuvo éxito
Inserción de Azumane tuvo éxito
Inserción de Hinata falló
Inserción de Tsukishima tuvo éxito
Inserción de Hinata tuvo éxito
Inserción de Hinata tuvo éxito
 
Azumane    | 184.7cm
Hinata     | 162.8cm
Kageyama   | 180.6cm
Kozume     | 169.2cm
Kuroo      | 187.7cm
Tsukishima | 188.3cm

[editar] Véase también

(C++11)
Construye el elemento en el sitio.
(función miembro pública) [editar]
Construye elementos en el sitio utilizando una pista.
(función miembro pública) [editar]
Inserta un elemento o asigna el elemento actual si la clave ya existe.
(función miembro pública) [editar]