Espacios de nombres
Variantes
Acciones

std::flat_set<Key,Compare,KeyContainer>::insert

De cppreference.com
< cpp‎ | container‎ | flat set
 
 
 
 
std::pair<iterator, bool> insert( const value_type& value );
(1) (desde C++23)
std::pair<iterator, bool> insert( value_type&& value );
(2) (desde C++23)
iterator insert( const_iterator pos, const value_type& value );
(3) (desde C++23)
iterator insert( const_iterator pos, value_type&& value );
(4) (desde C++23)
template< class K >
iterator insert( const_iterator pos, K&& x );
(5) (desde C++23)
template< class InputIt >
void insert( InputIt first, InputIt last );
(6) (desde C++23)
template< class K >
std::pair<iterator, bool> insert( K&& x );
(7) (desde C++23)
template< class InputIt >
void insert( std::sorted_unique_t, InputIt first, InputIt last );
(8) (desde C++23)
void insert( std::initializer_list<key_type> ilist );
(9) (desde C++23)
void insert( std::sorted_unique_t s, std::initializer_list<key_type> ilist );
(10) (desde C++23)

Inserta elemento(s) en el contenedor, si el contenedor no contiene ya un elemento con una clave equivalente.

1) Inserta value. Equivalente a return emplace(value);.
2) Inserta value. Equivalente a return emplace(std::move(value));.
3) Inserta value en la posición lo más cercana posible a la posición justo antes de pos. Equivalente a return emplace_hint(pos, value);.
4) Inserta value en la posición lo más cercana posible a la posición justo antes de pos. Equivalente a return emplace_hint(pos, std::move(value));.
5,7) Si *this ya contiene un elemento que se compara de forma transparente con x, no hace nada. De lo contrario, inserta un nuevo elemento como si fuera:
  • (5) emplace(pos, std::forward<K>(x)) (en la posición más cercana posible a la posición inmediatamente anterior a pos);
  • (7) emplace(std::forward<K>(x)).
La conversión de x en key_type debe construir un objeto u, para el cual find(k) == find(u) es true. De lo contrario, el comportamiento no está definido.
Estas sobrecargas solo participan en la resolución de sobrecargas si
  • El identificador calificado Compare::is_transparent es válido y denota un tipo, y
  • std::is_constructible_v<value_type, K> es true,
que, en conjunto, permiten llamar a esta función sin construir un ejemplar de Key.
6) Equivale a la secuencia de operaciones:
  1. Inserta elementos del rango [firstlast) como si fuera por c.insert(c.end(), first, last);.
  2. Ordena el rango de elementos recién insertados con respecto a compare.
  3. Fusiona el rango ordenado resultante y el rango ordenado de elementos preexistentes en un único rango ordenado. (Nota: la operación de fusión puede asignar memoria).
  4. Borra todos los elementos excepto el primero de cada grupo de elementos equivalentes consecutivos.
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 del rango [firstlast). Equivalente a insert(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).
9) Inserta elementos de la lista de inicializadores ilist. Equivalente a insert(ilist.begin(), ilist.end());.
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).
10) Inserta elementos de la lista de inicializadores ilist. Equivalente a insert(s, ilist.begin(), ilist.end());.
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).

La información sobre la invalidación del iterador se copia de aquí

Contenido

[editar] Parámetros

pos - Iterador de la posición antes de la cual se insertará el nuevo elemento.
value - Valor del elemento a insertar.
first, last - El par de iteradores que definen el fuente rango fuente de elementos a insertar
ilist - Lista de inicializadores desde la cual insertar los valores.
x - Un valor de cualquier tipo que se pueda comparar de forma transparente con una clave
s - Una etiqueta de desambiguación que indica que la secuencia de entrada está ordenada (con respecto a compare) y contiene solo elementos únicos
Requisitos de tipo
-
InputIt debe satisfacer los requisitos de IteradorDeEntradaLegado.

[editar] Valor de retorno

1,2) Un par que consta de un iterador al elemento insertado (o al elemento que impidió la inserción) y un valor bool establecido en true si y solo si se produjo la inserción.
3-5) Un iterador al elemento insertado o al elemento que impidió la inserción.
6) (Ninguno)
7) Un par que consta de un iterador al elemento insertado (o al elemento que impidió la inserción) y un valor bool establecido en true si y solo si se produjo la inserción.
8-10) (Ninguno)

[editar] Excepciones

1-5,7) Si cualquier operación genera una excepción, la inserción no tiene efecto.

[editar] Complejidad

1-5) Lineal en size().
6) N + M·log(M), donde N es el tamaño, size() antes de la operación y M es std::distance(first, last).
7) Lineal en size().
8) Lineal en N, donde N es size() después de la operación.
9) N + M·log(M), donde N es el tamaño, size() antes de la operación y M es ilist.size().
10) Lineal en N, donde N es size() después de la operación.

[editar] Notas

La inserción con pista o sugerencia (3-5) 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 <cassert>
#include <flat_set>
#include <iostream>
 
int main()
{
    std::flat_set<int> set;
 
    auto result_1 = set.insert(3);
    assert(result_1.first != set.end()); // es un iterador válido
    assert(*result_1.first == 3);
    if (result_1.second)
        std::cout << "hubo inserción\n";
 
    auto result_2 = set.insert(3);
    assert(result_2.first == result_1.first); // el mismo iterador
    assert(*result_2.first == 3);
    if (!result_2.second)
        std::cout << "no hubo inserción\n";
}

Salida:

hubo inserción
no hubo inserción

[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]
Crea un std::insert_iterator de tipo inferido a partir del argumento.
(plantilla de función) [editar]