std::set<Key,Compare,Allocator>::insert
std::pair<iterator,bool> insert( const value_type& value ); |
(1) | |
std::pair<iterator,bool> insert( value_type&& value ); |
(2) | (desde C++11) |
(3) | ||
iterator insert( iterator hint, const value_type& value ); |
(hasta C++11) | |
iterator insert( const_iterator hint, const value_type& value ); |
(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) | |
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 varios elementos en el contenedor, si el contenedor aún no contiene un elemento con una clave equivalente.
value
. value
en la posición lo más cerca posible, justo antes(desde C++11) de hint
. [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).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).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().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 la posición justo antes de hint
. El comportamiento no está definido si nh
no está vacío y get_allocator() != nh.get_allocator().No se invalidan ni referencias ni iteradores. Si la inserción tiene éxito, se invalidan los punteros y las referencias al elemento obtenido mientras se alberga en el identificador de nodo (node handle), y los punteros y las referencias obtenidas para ese elemento antes que se extrajera se vuelven válidas. (desde C++17)
Contenido |
[editar] Parámetros
hint | - |
| ||||
value | - | Valor del elemento a insertar. | ||||
first, last | - | El rango de los elementos a insertar. | ||||
ilist | - | La lista de inicializadores a partir 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
std::pair
que consiste en un iterador al elemento insertado (o al elemento que impidió la inserción) y un valor bool establecido en true si la inserción tuvo lugar.insert_return_type
con los miembros inicializados de la siguiente manera:
- Si
nh
está vacío,inserted
esfalse
,position
es end(), ynode
está vacío. - De lo contrario, si la inserción tomó lugar,
inserted
estrue
,position
apunta al elemento insertado, ynode
está vacío. - Si la inserción falló,
inserted
esfalse
,node
tiene el valor anterior denh
, yposition
apunta a un elemento con una clave equivalente a nh.key().
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
Esta sección está incompleta Razón: cases 5-8 |
[editar] Complejidad
O(log(size()))
.
3-4) Constante amortizada si la inserción ocurre en la posición justo después de la pista, logarítmica en el tamaño del contenedor de lo contrario.
|
(hasta C++11) |
3-4) Constante amortizada si la inserción ocurre en la posición justo antes de la pista, logarítmica en el tamaño del contenedor de lo contrario.
|
(desde C++11) |
O(N*log(size() + N))
, donde N es el número de elementos a insertar.O(log(size()))
.[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.
Las sobrecargas (5,6) frecuentemente se implementan como un bucle que llama a la sobrecarga (3) con end() como la pista; se optimizan para añadir una secuencia ordenada (como otro set) cuyo elemento más pequeño es mayor que el último elemento en *this.
[editar] Ejemplo
#include <set> #include <cassert> #include <iostream> int main() { std::set<int> set; auto resultado_1 = set.insert(3); assert(resultado_1.first != set.end()); // es un iterador válido assert(*resultado_1.first == 3); if (resultado_1.second) std::cout << "inserción completada\n"; auto resultado_2 = set.insert(3); assert(resultado_2.first == resultado_1.first); // el mismo iterador assert(*resultado_2.first == 3); if (!resultado_2.second) std::cout << "no hay inserción\n"; }
Salida:
inserción completada no hay inserción
[editar] Véase también
(C++11) |
Construye el elemento en el sitio. (función miembro pública) |
(C++11) |
Construye elementos en el sitio utilizando una pista. (función miembro pública) |