Namespaces
Variants

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: emplace_hint

From cppreference.net

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

Fügt ein neues Element in den Container ein, wobei hint als Vorschlag dient, wo das Element platziert werden sollte.

Der Konstruktor von value_type (d.h. std:: pair < const Key, T > ) wird mit exakt denselben Argumenten aufgerufen, die der Funktion übergeben wurden, weitergeleitet mit std:: forward < Args > ( args ) ... .

Falls nach dem Vorgang die neue Anzahl der Elemente größer ist als das alte max_load_factor() * bucket_count() findet eine Rehash-Operation statt.
Falls Rehashing auftritt (aufgrund der Einfügung), werden alle Iteratoren ungültig. Andernfalls (kein Rehashing) bleiben Iteratoren gültig.

Inhaltsverzeichnis

Parameter

hint - Iterator, der als Vorschlag dient, wo das neue Element eingefügt werden soll
args - Argumente, die an den Konstruktor des Elements weitergeleitet werden

Rückgabewert

Ein Iterator zum eingefügten Element oder zum Element, das die Einfügung verhindert hat.

Ausnahmen

Wenn aus irgendeinem Grund eine Exception ausgelöst wird, hat diese Funktion keine Wirkung ( strong exception safety guarantee ).

Komplexität

Amortisiert konstant im Durchschnitt, im schlimmsten Fall linear in der Größe des Containers.

Beispiel

#include <chrono>
#include <cstddef>
#include <functional>
#include <iomanip>
#include <iostream>
#include <unordered_map>
const int n_operations = 100'500'0;
std::size_t map_emplace()
{
    std::unordered_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::unordered_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::unordered_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::unordered_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::unordered_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<double, std::milli> time = stop - start;
    if (what.size() && map_size)
        std::cout << std::setw(8) << time << " für " << what << " (Verhältnis: "
                  << (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); // Cache-Warmup
    const auto x = time_it(map_emplace, "einfaches emplace");
    time_it(map_emplace_hint, "emplace mit korrektem Hinweis", x);
    time_it(map_emplace_hint_wrong, "emplace mit falschem Hinweis", x);
    time_it(map_emplace_hint_corrected, "korrigiertes emplace", x);
    time_it(map_emplace_hint_closest, "emplace mit zurückgegebenem Iterator", x);
}

Mögliche Ausgabe:

143.48ms für einfaches emplace (Verhältnis: 1.00)
164.78ms für emplace mit korrektem Hinweis (Verhältnis: 0.87)
171.22ms für emplace mit falschem Hinweis (Verhältnis: 0.84)
166.55ms für korrigiertes emplace (Verhältnis: 0.86)
167.41ms für emplace mit zurückgegebenem Iterator (Verhältnis: 0.86)

Siehe auch

Konstruiert Elemente direkt
(öffentliche Elementfunktion)
Fügt Elemente ein oder Knoten (seit C++17)
(öffentliche Elementfunktion)