Namespaces
Variants

std::map<Key,T,Compare,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 so nah wie möglich an die Position direkt vor hint in den Container ein.

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 ) ... .

Keine Iteratoren oder Referenzen werden ungültig.

Inhaltsverzeichnis

Parameter

Hinweis - Iterator auf die Position, vor der das neue Element eingefügt wird
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

Logarithmisch in der Größe des Containers im Allgemeinen, aber amortisiert konstant, wenn das neue Element direkt vor hint eingefügt wird.

Beispiel

#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
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- C++-spezifische Begriffe (`std::chrono::system_clock::now`) wurden nicht übersetzt
- Die ursprüngliche Formatierung wurde vollständig erhalten
- Der Link und alle Klassenattribute bleiben funktional identisch
Die Übersetzung folgt den professionellen Standards für technische Dokumentation, bei der Code-Elemente und API-Referenzen in ihrer originalen Form belassen werden.();
    const std::size_t map_size = map_test();
    const auto stop = std::chrono::system_clock::now();
    std::chrono::duration
(Keine Übersetzung erforderlich, da der Text innerhalb der HTML-Tags C++-spezifische Begriffe enthält und gemäß den Anweisungen unverändert bleiben soll)<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, "plain 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 unter Verwendung des zurückgegebenen Iterators", x);
}

Mögliche Ausgabe:

365.08ms für plain emplace (Verhältnis: 1.00)
 96.54ms für emplace mit korrektem Hinweis (Verhältnis: 3.78)
409.40ms für emplace mit falschem Hinweis (Verhältnis: 0.89)
 85.57ms für korrigiertes emplace (Verhältnis: 4.27)
 84.31ms für emplace mit zurückgegebenem Iterator (Verhältnis: 4.33)

Siehe auch

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