Namespaces
Variants

std::flat_set<Key,Compare,KeyContainer>:: emplace_hint

From de.cppreference.net

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

Fügt ein neues Element so nah wie möglich an die Position direkt vor hint in den Container ein.

Die Konstruktoren des Schlüssels und des zugeordneten Werts werden mit genau denselben Argumenten aufgerufen, die der Funktion übergeben wurden, weitergeleitet mit std:: forward < Args > ( args ) ... .

Inhalt

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.

Exceptions

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

Komplexität

Beispiel

#include <chrono>
#include <cstddef>
#include <functional>
#include <iomanip>
#include <iostream>
#include <flat_set>

const int n_operations = 100'500'0;

std::size_t set_emplace()
{
    std::flat_set<int> set;
    for (int i = 0; i < n_operations; ++i)
        set.emplace(i);
    return set.size();
}

std::size_t set_emplace_hint()
{
    std::flat_set<int> set;
    auto it = set.begin();
    for (int i = 0; i < n_operations; ++i)
    {
        set.emplace_hint(it, i);
        it = set.end();
    }
    return set.size();
}

std::size_t set_emplace_hint_wrong()
{
    std::flat_set<int> set;
    auto it = set.begin();
    for (int i = n_operations; i > 0; --i)
    {
        set.emplace_hint(it, i);
        it = set.end();
    }
    return set.size();
}

std::size_t set_emplace_hint_corrected()
{
    std::flat_set<int> set;
    auto it = set.begin();
    for (int i = n_operations; i > 0; --i)
    {
        set.emplace_hint(it, i);
        it = set.begin();
    }
    return set.size();
}

std::size_t set_emplace_hint_closest()
{
    std::flat_set<int> set;
    auto it = set.begin();
    for (int i = 0; i < n_operations; ++i)
        it = set.emplace_hint(it, i);
    return set.size();
}

double time_it(std::function<std::size_t()> set_test,
               const char* what = nullptr,
               double ratio = 0.0)
{
    const auto start = std::chrono::system_clock::now();
    const std::size_t setsize = set_test();
    const auto stop = std::chrono::system_clock::now();
    const std::chrono::duration<double, std::milli> time = stop - start;
    if (what != nullptr && setsize > 0)
        std::cout << std::setw(8) << time << " for " << what << " (ratio: "
                  << (ratio == 0.0 ? 1.0 : ratio / time.count()) << ")\n";
    return time.count();
}

int main()
{
    std::cout << std::fixed << std::setprecision(2);
    time_it(set_emplace); // cache warmup
    const auto x = time_it(set_emplace, "plain emplace");
    time_it(set_emplace_hint, "emplace with correct hint", x);
    time_it(set_emplace_hint_wrong, "emplace with wrong hint", x);
    time_it(set_emplace_hint_corrected, "corrected emplace", x);
    time_it(set_emplace_hint_closest, "emplace using returned iterator", x);
}

Mögliche Ausgabe:\n

  22.91ms for plain emplace (ratio: 1.00)
  40.73ms for emplace with correct hint (ratio: 0.56)
3713.24ms for emplace with wrong hint (ratio: 0.01)
2824.25ms for corrected emplace (ratio: 0.01)
   5.96ms for emplace using returned iterator (ratio: 3.86)

Siehe auch

Konstruiert Elemente direkt
(öffentliche Elementfunktion)
Fügt Elemente ein
(öffentliche Elementfunktion)