std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::insert_or_assign
template <class M> std::pair<iterator, bool> insert_or_assign( const Key& k, M&& obj ); |
(1) | (since C++17) |
template <class M> std::pair<iterator, bool> insert_or_assign( Key&& k, M&& obj ); |
(2) | (since C++17) |
template <class M> iterator insert_or_assign( const_iterator hint, const Key& k, M&& obj ); |
(3) | (since C++17) |
template <class M> iterator insert_or_assign( const_iterator hint, Key&& k, M&& obj ); |
(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 an insertion occurs and results in a rehashing of the container, all iterators are invalidated. Otherwise iterators are not affected. References are not invalidated. Rehashing occurs only if the new number of elements is greater than max_load_factor()*bucket_count()
.
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 testing macro: __cpp_lib_unordered_map_try_emplace
.
Example
#include <iostream> #include <unordered_map> #include <string> auto print_node = [](const auto &node) { std::cout << "[" << node.first << "] = " << node.second << '\n'; }; auto 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
(C++11)
|
access or insert specified element (public member function) |
(C++11)
|
access specified element with bounds checking (public member function) |
(C++11)
|
inserts elements or nodes (since C++17) (public member function) |
(C++11)
|
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