std::flat_m...emplace_hint(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… std::flat_map::emplace_hint πŸ’…

okay so this is the std::flat_m...emplace_hint(3) page from the C++ Standard Libary, and it's giving insert but make it hinted. slay. ✨ iykyk.

🌸 NAME 🌸

std::flat_map::emplace_hint β€” yeah, that's the whole name. iconic, no notes.

✨ Synopsis ✨

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

So this one drops a new element into the container as close as possible to the position just before hint. 🫢

The constructor of the element type (value_type, that is, std::pair<const Key, T>) gets called with exactly the same arguments you passed to the function, forwarded with std::forward<Args>(args).... no extra seasoning. πŸ’…

🧚 information on iterator invalidation is copied from here β€” that's literally what the page says, bestie.

πŸŽ€ Parameters πŸŽ€

  • hint β€” iterator to the position before which the new element will be inserted.
  • args β€” arguments to forward to the constructor of the element.

πŸ’– Return value πŸ’–

An iterator to the inserted element, or to the element that prevented the insertion. yes, it might hand you the blocker instead. 😭

πŸ”₯ Exceptions πŸ”₯

If an exception is thrown for any reason, this function has no effect β€” that's the strong exception safety guarantee. so if it throws, it's a clean no-op. periodt.

πŸŒ€ Complexity πŸŒ€

This section is incomplete. (the page said it, not me πŸ’€)

πŸ“ Example πŸ“

// Run this code

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

const int n_operations = 100'500'0;

std::size_t map_emplace()
{
    std::flat_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::flat_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::flat_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::flat_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::flat_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 << " 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(map_emplace); // cache warmup
    const auto x = time_it(map_emplace, "plain emplace");
    time_it(map_emplace_hint, "emplace with correct hint", x);
    time_it(map_emplace_hint_wrong, "emplace with wrong hint", x);
    time_it(map_emplace_hint_corrected, "corrected emplace", x);
    time_it(map_emplace_hint_closest, "emplace using returned iterator", x);
}

🌫️ Possible output 🌫️

...TODO...

πŸ‘€ See also πŸ‘€

  • emplace β€” constructs element in-place (public member function).
  • insert β€” inserts elements (public member function).

πŸ—‚οΈ Category πŸ—‚οΈ

  • * Todo without reason

source/version: http://cppreference.com Β· date: 2024.06.10 Β· page: std::flat_m...emplace_hint(3) β€” byeee bestie, go emplace something cute πŸ’–πŸ¦‹πŸŽ€

πŸ“¦ where this page comes from