std::unorde...t_or_assign(3)
π std::unorde...t_or_assign(3) π
okay so bestie, this is std::unorde...t_or_assign(3) from the C++ Standard Libary manual, and it's literally the insert-or-assign glow-up for std::unordered_map π«Ά. Itβs giving βput it in if itβs not there, overwrite it if it is,β and Iβm obsessed. No cap.
β¨ NAME β¨
std::unordered_map::insert_or_assignβstd::unordered_map::insert_or_assign
π¦ SYNOPSIS π¦
(1) (since C++17)
template< class M >
std::pair<iterator, bool> insert_or_assign( const Key& k, M&& obj );
(2) (since C++17)
template< class M >
std::pair<iterator, bool> insert_or_assign( Key&& k, M&& obj );
(3) (since C++26)
template< class K, class M >
std::pair<iterator, bool> insert_or_assign( K&& k, M&& obj );
(4) (since C++17)
template< class M >
iterator insert_or_assign( const_iterator hint, const Key& k, M&& obj );
(5) (since C++17)
template< class M >
iterator insert_or_assign( const_iterator hint, Key&& k, M&& obj );
(6) (since C++26)
template< class K, class M >
iterator insert_or_assign( const_iterator hint, K&& k, M&& obj );
πΈ DESCRIPTION πΈ
- 1,4) If a key equivalent to
kalready exists in the container, assignsstd::forward<M>(obj)to themapped_typecorresponding to the keyk. If the key does not exist, inserts the new value as if byinsert, constructing it fromvalue_type(k, std::forward<M>(obj)). - 2,5) Same as (1,4), except the mapped value is constructed from
value_type(std::move(k), std::forward<M>(obj)). - 3,6) If a key equivalent to
kalready exists in the container, assignsstd::forward<M>(obj)to themapped_typecorresponding to the keyk. If the key does not exist, constructs an objectuofvalue_typewithstd::forward<K>(k), std::forward<M>(obj)), then insertsuinto*this. Ifhash_function()(u.first) != hash_function()(k) || contains(u.first)is true, the behavior is undefined. Thevalue_typemust beEmplaceConstructibleintounordered_mapfromstd::forward<K>(k), std::forward<M>(obj). This overload participates in overload resolution only ifHash::is_transparentandKeyEqual::is_transparentare valid and each denotes a type. This assumes that suchHashis callable with bothKandKeytype, and that theKeyEqualis transparent, which, together, allows calling this function without constructing an instance ofKey.
π¨ Important behavior check, bestie: The behavior is undefined (until C++20) / The program is ill-formed (since C++20) if std::is_assignable_v<mapped_type&, M&&> is false. Do not skip this π.
If after the operation the new number of elements is greater than old max_load_factor() * bucket_count() a rehashing takes place. If rehashing occurs (due to the insertion), all iterators are invalidated. Otherwise (no rehashing), iterators are not invalidated.
π PARAMETERS π
kβ the key used both to look up and to insert if not foundhintβ iterator to the position before which the new element will be insertedobjβ the value to insert or assign
π RETURN VALUE π
- 1-3) The
boolcomponent istrueif the insertion took place andfalseif the assignment took place. The iterator component is pointing at the element that was inserted or updated. - 4-6) Iterator pointing at the element that was inserted or updated.
π₯ COMPLEXITY π₯
- 1-3) Same as for
emplace. - 4-6) Same as for
emplace_hint.
π NOTES π
insert_or_assign returns more information than operator[] and does not require default-constructibility of the mapped type. Slay.
Feature-test macros, because we love receipts:
- Feature-test macro:
__cpp_lib_unordered_map_try_emplaceβ Value:201411Lβ Std:(C++17)β coversstd::unordered_map::try_emplace,std::unordered_map::insert_or_assign. - Feature-test macro:
__cpp_lib_associative_heterogeneous_insertionβ Value:202311Lβ Std:(C++26)β Heterogeneous overloads for the remaining member functions in ordered and unordered associative containers. Overloads (3) and (6).
π EXAMPLE π
run this code, itβs literally right here:
#include <iostream>
#include <string>
#include <unordered_map>
void print_node(const auto& node)
{
std::cout << '[' << node.first << "] = " << node.second << '\n';
}
void print_result(auto const& pair)
{
std::cout << (pair.second ? "inserted: " : "assigned: ");
print_node(*pair.first);
}
int main()
{
std::unordered_map<std::string, std::string> myMap;
print_result(myMap.insert_or_assign("a", "apple"));
print_result(myMap.insert_or_assign("b", "banana"));
print_result(myMap.insert_or_assign("c", "cherry"));
print_result(myMap.insert_or_assign("c", "clementine"));
for (const auto& node : myMap)
print_node(node);
}
π POSSIBLE OUTPUT π
inserted: [a] = apple
inserted: [b] = banana
inserted: [c] = cherry
assigned: [c] = clementine
[c] = clementine
[a] = apple
[b] = banana
π¦ SEE ALSO π¦
operator[]β access or insert specified element (public member function)atβ access specified element with bounds checking (public member function)insertβ inserts elements or nodes (since C++17) (public member function)emplaceβ constructs element in-place (public member function)
π sourced from http://cppreference.com Β· dated 2024.06.10 Β· byeee bestie, go insert-or-assign your dreams π«Ά
π¦ 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