Namespaces
Variants

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

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (desde C++11)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (desde C++17)
template < class P >
std:: pair < iterator, bool > insert ( P && value ) ;
(3) (desde C++11)
iterator insert ( const_iterator hint, const value_type & value ) ;
(4) (desde C++11)
iterator insert ( const_iterator hint, value_type && value ) ;
(5) (desde C++17)
template < class P >
iterator insert ( const_iterator hint, P && value ) ;
(6) (desde C++11)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(7) (desde C++11)
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 elemento(s) en el contenedor, si el contenedor aún no contiene un elemento con una clave equivalente.

1-3) Inserta value .
La sobrecarga (3) es equivalente a emplace ( std:: forward < P > ( value ) ) y solo participa en la resolución de sobrecarga si std:: is_constructible < value_type, P && > :: value == true .
4-6) Inserta value , usando hint como sugerencia no vinculante sobre dónde debería comenzar la búsqueda.
La sobrecarga (6) es equivalente a emplace_hint ( hint, std:: forward < P > ( value ) ) y solo participa en la resolución de sobrecarga si std:: is_constructible < value_type, P && > :: value == true .
7) Inserta elementos del rango [ first , last ) . Si múltiples elementos en el rango tienen claves que son equivalentes, no está especificado qué elemento se inserta (pendiente de LWG2844 ).
Si [ first , last ) no es un rango válido , o first y/o last son iteradores dentro de * this , el comportamiento es indefinido.
8) Inserta elementos desde la lista de inicialización ilist . Si múltiples elementos en el rango tienen claves que comparan equivalentes, no está especificado qué elemento se inserta (pendiente de LWG2844 ).
9) Si nh es un node handle vacío, no hace nada. De lo contrario, inserta el elemento poseído por nh en el contenedor, si el contenedor aún no contiene un elemento con una clave equivalente a nh. key ( ) . El comportamiento es indefinido si nh no está vacío y get_allocator ( ) ! = nh. get_allocator ( ) .
10) Si nh es un node handle vacío, no hace nada y retorna el iterador final. De lo contrario, inserta el elemento poseído por nh en el contenedor, si el contenedor aún no contiene un elemento con una clave equivalente a nh. key ( ) , y retorna el iterador que apunta al elemento con clave equivalente a nh. key ( ) (independientemente de si la inserción tuvo éxito o falló). Si la inserción tiene éxito, nh es movido, de lo contrario conserva la propiedad del elemento. hint se utiliza como sugerencia no vinculante sobre dónde debería comenzar la búsqueda. El comportamiento es indefinido si nh no está vacío y get_allocator ( ) ! = nh. get_allocator ( ) .

Si después de la operación el nuevo número de elementos es mayor que el antiguo max_load_factor() * bucket_count() se produce una redistribución de cubos (rehashing).
Si ocurre redistribución de cubos (debido a la inserción), todos los iteradores quedan invalidados. En caso contrario (sin redistribución), los iteradores no se invalidan. Si la inserción es exitosa, los punteros y referencias al elemento obtenidos mientras se mantiene en el node handle se invalidan, y los punteros y referencias obtenidos para ese elemento antes de ser extraído pasan a ser válidos. (desde C++17)

Contenidos

Parámetros

hint - iterador, utilizado como sugerencia sobre dónde insertar el contenido
value - valor del elemento a insertar
first, last - el par de iteradores que define el rango fuente de elementos a insertar
ilist - lista de inicializadores de la cual insertar los valores
nh - un manejador de nodo compatible
Requisitos de tipo
-
InputIt debe cumplir con los requisitos de LegacyInputIterator .

Valor de retorno

1-3) Un par que consiste en un iterador al elemento insertado (o al elemento que impidió la inserción) y un valor bool establecido en true si y solo si la inserción tuvo lugar.
4-6) Un iterador al elemento insertado, o al elemento que impidió la inserción.
7,8) (ninguno)
9) Un objeto de 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 tuvo 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 previo de nh , y position apunta a un elemento con una clave equivalente a nh. key ( ) .
10) Iterador final si nh estaba vacío, iterador que apunta al elemento insertado si la inserción tuvo lugar, e iterador que apunta a un elemento con una clave equivalente a nh. key ( ) si falló.

Excepciones

1-6) Si se lanza una excepción por cualquier motivo, estas funciones no tienen efecto ( strong exception safety guarantee ).
7,8) No hay garantía de seguridad de excepciones.
9,10) Si se lanza una excepción por cualquier motivo, estas funciones no tienen efecto ( strong exception safety guarantee ).

Complejidad

1-6) Caso promedio: O(1) , caso peor O(size()) .
7,8) Caso promedio: O(N) , donde N es el número de elementos a insertar. Caso peor: O(N * size() + N) .
9,10) Caso promedio: O(1) , caso peor O(size()) .

Notas

La inserción con sugerencia ( ( 4-6 ) y ( 10 ) ) no retorna un booleano para ser compatible en firma con la inserción posicional en contenedores secuenciales, como std::vector::insert . Esto permite crear insertores genéricos como std::inserter . Una forma de verificar el éxito de una inserción con sugerencia es comparar size() antes y después.

Ejemplo

#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
    std::unordered_map<int, std::string> dict = {{1, "one"}, {2, "two"}};
    dict.insert({3, "three"});
    dict.insert(std::make_pair(4, "four"));
    dict.insert({{4, "another four"}, {5, "five"}});
    const bool ok = dict.insert({1, "another one"}).second;
    std::cout << "inserting 1 => \"another one\" "
              << (ok ? "succeeded" : "failed") << '\n';
    std::cout << "contents:\n";
    for (auto& p : dict)
        std::cout << ' ' << p.first << " => " << p.second << '\n';
}

Salida posible:

inserting 1 => "another one" failed
contents:
 5 => five
 1 => one
 2 => two
 3 => three
 4 => four

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2005 C++11 las sobrecargas ( 3 ) y ( 6 ) solo participarían en la resolución de sobrecarga
si P es convertible implícitamente a value_type
solo participa si value_type
es construible desde P &&

Véase también

construye un elemento in situ
(función miembro pública)
construye elementos in situ usando una sugerencia
(función miembro pública)
inserta un elemento o asigna al elemento actual si la clave ya existe
(función miembro pública)
crea un std::insert_iterator del tipo inferido del argumento
(plantilla de función)