std::flat_m...emplace_hint(3)
π 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
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms