std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: insert
|
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.
[
first
,
last
)
. Si múltiples elementos en el rango tienen claves que son equivalentes, no está especificado qué elemento se inserta (pendiente de
LWG2844
).
[
first
,
last
)
no es un
rango válido
, o
first
y/o
last
son iteradores dentro de
*
this
, el comportamiento es indefinido.
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
insert_return_type
con los miembros inicializados de la siguiente manera:
-
Si
nh
está vacío,
insertedes false ,positiones end ( ) , ynodeestá vacío. -
De lo contrario, si la inserción tuvo lugar,
insertedes true ,positionapunta al elemento insertado, ynodeestá vacío. -
Si la inserción falló,
insertedes false ,nodetiene el valor previo de nh , ypositionapunta a un elemento con una clave equivalente a nh. key ( ) .
Excepciones
Complejidad
O(1)
, caso peor
O(size())
.
O(N)
, donde N es el número de elementos a insertar. Caso peor:
O(N * size() + N)
.
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) |
|
|
(C++17)
|
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) |