On this page
std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::insert_or_assign
|
(1) | (since C++17) |
|
(2) | (since C++17) |
|
(3) | (since C++17) |
|
(4) | (since C++17) |
k already exists in the container, assigns std::forward<M>(obj) to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value as if by insert, constructing it from value_type(k, std::forward<M>(obj)).
value_type(std::move(k), std::forward<M>(obj)).
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.
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 found |
| hint | - | iterator to the position before which the new element will be inserted |
| obj | - | the value to insert or assign |
Return value
true if the insertion took place and false if the assignment took place. The iterator component is pointing at the element that was inserted or updated.
Complexity
emplace.
emplace_hint.
Notes
insert_or_assign returns more information than operator[] and does not require default-constructibility of the mapped type.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_unordered_map_try_emplace |
201411L | (C++17) | std::unordered_map::try_emplace,std::unordered_map::insert_or_assign |
Example
#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
| access or insert specified element (public member function) |
|
| access specified element with bounds checking (public member function) |
|
| inserts elements or nodes(since C++17) (public member function) |
|
| constructs element in-place (public member function) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/unordered_map/insert_or_assign