std::map<Key,T,Compare,Allocator>::emplace_hint
template <class... Args> iterator emplace_hint( const_iterator hint, Args&&... args ); |
(desde C++11) | |
Inserta (emplaza) un nuevo elemento en el contenedor lo más cerca posible de la posición justo antes de hint. El elemento se construye en el sitio, es decir, no se realizan operaciones de copia o movimiento.
El constructor del tipo del elemento (value_type, es decir, std::pair<const Key, T>) se llama con exactamente los mismos argumentos que se suministraron a la función, reenviados con std::forward<Args>(args)....
No se invalidan ni referencias ni iteradores.
Parámetros
| hint | - | El iterador a la posición antes de la cual se insertará el nuevo elemento. |
| args | - | Los argumentos a reenviar al constructor del elemento. |
Valor de retorno
Devuelve un iterador al elemento recién insertado.
Si la inserción falló porque el elemento ya existe, devuelve un iterador al elemento ya existente con la clave equivalente.
Excepciones
Si alguna operación lanza una excepción, esta función no tiene ningún efecto (garantía de excepción fuerte).
Complejidad
En general, logarítmica en el tamaño del contenedor, pero amortizada constante si el nuevo elemento se inserta justo antes de hint.
Ejemplo
El siguiente código utiliza distintas pistas de emplazamiento, proporcionando pistas correctas y equivocadas, y cronometra los resultados.
#include <chrono>
#include <iostream>
#include <iomanip>
#include <functional>
#include <map>
const int nof_operaciones = 100500;
int emplazar_para_map() {
std::map<int, char> map;
for(int i = 0; i < nof_operaciones; ++i) {
map.emplace(i, 'a');
}
return map.size();
}
int pista_de_emplazamiento_para_map() {
std::map<int, char> map;
auto it = map.begin();
for(int i = 0; i < nof_operaciones; ++i) {
map.emplace_hint(it, i, 'b');
it = map.end();
}
return map.size();
}
int pista_de_emplazamiento_para_map_equivocada() {
std::map<int, char> map;
auto it = map.begin();
for(int i = nof_operaciones; i > 0; --i) {
map.emplace_hint(it, i, 'c');
it = map.end();
}
return map.size();
}
int pista_de_emplazamiento_para_map_corregida() {
std::map<int, char> map;
auto it = map.begin();
for(int i = nof_operaciones; i > 0; --i) {
map.emplace_hint(it, i, 'd');
it = map.begin();
}
return map.size();
}
int pista_de_emplazamiento_para_map_mas_cercana() {
std::map<int, char> map;
auto it = map.begin();
for(int i = 0; i < nof_operaciones; ++i) {
it = map.emplace_hint(it, i, 'e');
}
return map.size();
}
void cronometrar(std::function<int()> prueba_de_map, std::string what = "") {
auto inicio = std::chrono::system_clock::now();
int mapsize = prueba_de_map();
auto detencion = std::chrono::system_clock::now();
std::chrono::duration<double, std::milli> tiempo = detencion - inicio;
if (what.size() > 0 && mapsize > 0) {
std::cout << std::fixed << std::setprecision(2) << std::setw(5)
<< tiempo.count() << " ms para " << what << '\n';
}
}
int main() {
cronometrar(emplazar_para_map); // calentamiento de pila
cronometrar(emplazar_para_map, "el emplazamiento simple");
cronometrar(pista_de_emplazamiento_para_map, "el emplazamiento con la pista correcta");
cronometrar(pista_de_emplazamiento_para_map_equivocada, "el emplazamiento con la pista equivocada");
cronometrar(pista_de_emplazamiento_para_map_corregida, "el emplazamiento corregido");
cronometrar(pista_de_emplazamiento_para_map_mas_cercana, "el emplazamiento usando el iterador devuelto");
}
Posible salida:
22.64 ms para el emplazamiento simple
8.81 ms para el emplazamiento con la pista correcta
22.27 ms para el emplazamiento con la pista equivocada
7.76 ms para el emplazamiento corregido
8.30 ms para el emplazamiento usando el iterador devuelto
Véase también
(C++11) |
Construye el elemento en el sitio. (función miembro pública) |
| Inserta elementos o nodos (desde C++17) (función miembro pública) |