Espacios de nombres
Variantes
Acciones

std::unordered_set<Key,Hash,KeyEqual,Allocator>::insert

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

Inserta uno o más elementos en el contenedor si el contenedor no contiene un elemento con una clave equivalente.

1-2) Inserta value.
3-4) Inserta value, utilizando hint como una sugerencia no obligatoria de dónde iniciar la búsqueda.
5) 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).
6) 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).
7) 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().
8) 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 hint. El comportamiento no está definido si nh no está vacío y get_allocator() != nh.get_allocator().

Si ocurre una redispersión (rehashing) debido a la inserción, se invalidan todos los iteradores. De lo contrario, no se afectan los iteradores. Las referencias no se invalidan. La dispersión vuelve a ocurrir solo si el nuevo número de elementos es mayor que max_load_factor()*bucket_count(). Si la inserción tuvo éxito, se invalidan los punteros y referencias al elemento obtenido mientras se alberga en el identificador de nodo (node handle), y los punteros y referencias a ese elemento antes que se extrajera se vuelven válidas. (desde C++17)

Contenido

[editar] Parámetros

hint - Un iterador usado como sugerencia para dónde insertar el contenido.
value - El valor del elemento a insertar.
first, last - El rango de elementos a insertar.
ilist - La lista de inicializadores 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-2) Devuelve un std::pair que consiste en un iterador al elemento insertado (o al elemento que impidió la inserción) y un valor bool que denota si la inserción tuvo lugar.
3-4) Devuelve un iterador al elemento insertado, o al elemento que impidió la inserción.
5-6) (Ninguno)
7) 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().
8) 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-4) Si alguna operación lanza una excepción, la inserción no tiene ningún efecto.

[editar] Complejidad

1-4) O(1) en el caso promedio; O(size()) en el peor de los casos.
5-6) O(N) en el caso promedio, donde N es el número de elementos a insertar; O(N*size()+N) en el peor de los casos.
7-8) O(1) en el caso promedio; O(size()) en el peor de los casos.

[editar] Notas

La inserción con pista o sugerencia (3,4) 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

#include <unordered_set>
#include <iostream>
#include <array>
 
std::ostream& operator<< (std::ostream& os, std::unordered_set<int> const& s) {
  for (os << "[" << s.size() << "] { "; int i : s)
    os << i << ' ';
  return os << "}\n";
}
 
int main ()
{
  std::unordered_set<int> nums = {2, 3, 4};
 
  std::cout << "Inicialmente: " << nums;
  auto p = nums.insert (1); // insertar elemento
  std::cout << "'1' se ha insertado: " << std::boolalpha << p.second << '\n';
  std::cout << "Después de la inserción: " << nums;
 
  nums.insert (p.first, 0); // insertar con pista
  std::cout << "Después de la inserción: " << nums;
 
  std::array<int, 4> a  = {10, 11, 12, 13};
  nums.insert (a.begin (), a.end ()); // insertar rango
  std::cout << "Después de la inserción: " << nums;
 
  nums.insert ({20, 21, 22, 23}); // insertar lista de inicializadores
  std::cout << "Después de la inserción: " << nums;
 
  std::unordered_set<int> otros_nums = {42, 43};
  auto nodo = otros_nums.extract (otros_nums.find (42));
  nums.insert (std::move (nodo)); // insertar nodo
  std::cout << "Después de la inserción: " << nums;
 
  nodo = otros_nums.extract (otros_nums.find (43));
  nums.insert (nums.begin (), std::move (nodo)); // insertar nodo con pista
  std::cout << "Después de la inserción: " << nums;
}

Posible salida:

Inicialmente: [3] { 4 3 2 }
'1' se ha insertado: true
Después de la inserción: [4] { 1 2 3 4 }
Después de la inserción: [5] { 0 1 2 3 4 }
Después de la inserción: [9] { 13 12 11 10 4 3 2 1 0 }
Después de la inserción: [13] { 23 22 13 12 11 10 21 4 20 3 2 1 0 }
Después de la inserción: [14] { 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }
Después de la inserción: [15] { 43 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }

[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]