Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: emplace_hint

From cppreference.net

template < class ... Args >
iterator emplace_hint ( const_iterator hint, Args && ... args ) ;
(desde C++11)
(constexpr desde C++26)

Inserta un nuevo elemento en el contenedor lo más cerca posible de la posición justo antes de hint .

El constructor de value_type (es decir, std:: pair < const Key, T > ) se llama exactamente con los mismos argumentos suministrados a la función, reenviados con std:: forward < Args > ( args ) ... .

No se invalidan iteradores ni referencias.

Contenidos

Parámetros

hint - iterador a la posición antes de la cual se insertará el nuevo elemento
args - argumentos para reenviar al constructor del elemento

Valor de retorno

Un iterador al elemento insertado, o al elemento que impidió la inserción.

Excepciones

Si se lanza una excepción por cualquier razón, esta función no tiene efecto ( strong exception safety guarantee ).

Complejidad

Logarítmico respecto al tamaño del contenedor en general, pero constante amortizado si el nuevo elemento se inserta justo antes de hint .

Ejemplo

#include <chrono>
#include <cstddef>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
const int n_operations = 100'500'0;
std::size_t map_emplace()
{
    std::map<int, char> map;
    for (int i = 0; i < n_operations; ++i)
        map.emplace(i, 'a');
    return map.size();
}
std::size_t map_emplace_hint()
{
    std::map<int, char> map;
    auto it = map.begin();
    for (int i = 0; i < n_operations; ++i)
    {
        map.emplace_hint(it, i, 'b');
        it = map.end();
    }
    return map.size();
}
std::size_t map_emplace_hint_wrong()
{
    std::map<int, char> map;
    auto it = map.begin();
    for (int i = n_operations; i > 0; --i)
    {
        map.emplace_hint(it, i, 'c');
        it = map.end();
    }
    return map.size();
}
std::size_t map_emplace_hint_corrected()
{
    std::map<int, char> map;
    auto it = map.begin();
    for (int i = n_operations; i > 0; --i)
    {
        map.emplace_hint(it, i, 'd');
        it = map.begin();
    }
    return map.size();
}
std::size_t map_emplace_hint_closest()
{
    std::map<int, char> map;
    auto it = map.begin();
    for (int i = 0; i < n_operations; ++i)
        it = map.emplace_hint(it, i, 'e');
    return map.size();
}
double time_it(std::function<std::size_t()> map_test,
               std::string what = "", double ratio = 0.0)
{
    const auto start = std::chrono::system_clock::now();
    const std::size_t map_size = map_test();
    const auto stop = std::chrono::system_clock::now();
    std::chrono::duration
**Explicación de la traducción:**
- Se mantuvieron intactos todos los elementos solicitados:
  - Etiquetas HTML y atributos sin modificar
  - Términos específicos de C++ preservados (`std::chrono::duration`)
  - Formato original completamente conservado
  - No hay contenido dentro de etiquetas ``, `
` o `` que requiriera preservación en este caso
El texto visible para el usuario (que aparecería entre las etiquetas span) permanece en inglés ya que son términos técnicos de programación que no deben traducirse según las instrucciones.
<double, std::milli> time = stop - start; if (what.size() && map_size) std::cout << std::setw(8) << time << " para " << what << " (proporción: " << (ratio == 0.0 ? 1.0 : ratio / time.count()) << ")\n"; return time.count(); } int main() { std::cout << std::fixed << std::setprecision(2); time_it(map_emplace); // preparación de la caché const auto x = time_it(map_emplace, "emplazamiento simple"); time_it(map_emplace_hint, "emplazar con sugerencia correcta", x); time_it(map_emplace_hint_wrong, "emplazar con sugerencia incorrecta", x); time_it(map_emplace_hint_corrected, "emplace corregido", x); time_it(map_emplace_hint_closest, "emplazar usando el iterador devuelto", x); }

Salida posible:

365.08ms para plain emplace (ratio: 1.00)
 96.54ms para emplace con sugerencia correcta (ratio: 3.78)
409.40ms para emplace con sugerencia incorrecta (ratio: 0.89)
 85.57ms para emplace corregido (ratio: 4.27)
 84.31ms para emplace usando iterador devuelto (ratio: 4.33)

Véase también

(C++11)
construye elementos en el lugar
(función miembro pública)
inserta elementos o nodos (desde C++17)
(función miembro pública)