std::set<Key,Compare,Allocator>:: insert
|
std::
pair
<
iterator,
bool
>
insert
(
const
value_type
&
value
)
;
|
(1) | (constexpr desde C++26) |
|
std::
pair
<
iterator,
bool
>
insert
(
value_type
&&
value
)
;
|
(2) |
(desde C++11)
(constexpr desde C++26) |
| (3) | ||
|
iterator insert
(
iterator pos,
const
value_type
&
value
)
;
|
(hasta C++11) | |
|
iterator insert
(
const_iterator pos,
const
value_type
&
value
)
;
|
(desde C++11)
(constexpr desde C++26) |
|
|
iterator insert
(
const_iterator pos, value_type
&&
value
)
;
|
(4) |
(desde C++11)
(constexpr desde C++26) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(5) | (constexpr desde C++26) |
|
void
insert
(
std::
initializer_list
<
value_type
>
ilist
)
;
|
(6) |
(desde C++11)
(constexpr desde C++26) |
|
insert_return_type insert
(
node_type
&&
nh
)
;
|
(7) |
(desde C++17)
(constexpr desde C++26) |
|
iterator insert
(
const_iterator pos, node_type
&&
nh
)
;
|
(8) |
(desde C++17)
(constexpr desde C++26) |
|
template
<
class
K
>
std:: pair < iterator, bool > insert ( K && x ) ; |
(9) |
(desde C++23)
(constexpr desde C++26) |
|
template
<
class
K
>
iterator insert ( const_iterator pos, K && x ) ; |
(10) |
(desde C++23)
(constexpr desde C++26) |
Intenta insertar elemento(s) en * this .
- Si * this ya contiene un elemento con una clave equivalente, no hace nada.
- En caso contrario, inserta el(los) elemento(s) en * this .
| (since C++11) |
[
first
,
last
)
.
|
(desde C++11) |
- first o last es un iterador que apunta a * this .
value_type
con
std::
forward
<
K
>
(
x
)
y luego inserta
u
en
*
this
. La existencia de la clave equivalente se determina de forma transparente usando
x
antes de construir
u
.
-
value_typeno es EmplaceConstructible ensetdesde std:: forward < K > ( x ) . - equal_range ( u ) == equal_range ( x ) es false .
-
Comparees transparent . - std:: is_convertible_v < K && , const_iterator > es false .
- std:: is_convertible_v < K && , iterator > es false .
No se invalidan iteradores ni referencias. Si la inserción es exitosa, se invalidan los punteros y referencias al elemento obtenidos mientras se mantiene en el node handle, 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
| pos | - | iterador a 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 define el rango fuente de elementos a insertar |
| ilist | - | lista de inicializadores de la cual insertar los valores |
| nh | - | un node handle compatible |
| x | - | un valor de cualquier tipo que pueda compararse transparentemente con una clave |
| 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
Si se lanza una excepción por cualquier operación durante la inserción de un solo elemento, la inserción no tiene efecto.
Complejidad
Dado N como size ( ) :
Notas
La inserción con sugerencia
(
(
3,4
)
,
(
8
)
y
(
10
)
)
no devuelve un booleano para ser compatible en firma con la inserción posicional en contenedores secuenciales, como
std::vector::insert
. Esto hace posible 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.
Las sobrecargas ( 5,6 ) frecuentemente se implementan como un bucle que llama a la sobrecarga ( 3 ) con end() como sugerencia; están optimizadas para añadir una secuencia ordenada (como otro std::set ) cuyo elemento más pequeño es mayor que el último elemento en * this .
Si múltiples elementos en el rango tienen claves que son equivalentes al comparar, no está especificado qué elemento se inserta (pendiente de LWG2844 ).
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_insertion
|
202311L
|
(C++26) | Sobrecargas heterogéneas para las funciones miembro restantes en contenedores asociativos ordenados y contenedores asociativos no ordenados. ( 9,10 ) |
Ejemplo
#include <cassert> #include <iostream> #include <set> int main() { std::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 << "insert done\n"; auto result_2 = set.insert(3); assert(result_2.first == result_1.first); // mismo iterador assert(*result_2.first == 3); if (!result_2.second) std::cout << "no insertion\n"; }
Salida:
insert done no insertion
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 233 | C++98 | pos era solo una sugerencia, podía ser completamente ignorada |
la inserción debe realizarse
lo más cerca posible de la posición inmediatamente anterior a pos |
| LWG 264 | C++98 |
la complejidad de la sobrecarga
(
5
)
debía ser lineal si
el rango
[
first
,
last
)
está ordenado según
Compare
|
se eliminó el requisito lineal
en este caso especial |
| LWG 316 | C++98 |
en el valor de retorno de la sobrecarga
(
1
)
, no se especificaba
qué valor bool indicaba una inserción exitosa |
el éxito se indica con true |
Véase también
|
(C++11)
|
construye elemento in situ
(función miembro pública) |
|
(C++11)
|
construye elementos in situ usando una pista
(función miembro pública) |
|
crea un
std::insert_iterator
del tipo inferido del argumento
(plantilla de función) |