table of contents
        
      
      
    | std::unordered_map::insert_or_assign(3) | C++ Standard Libary | std::unordered_map::insert_or_assign(3) | 
NAME¶
std::unordered_map::insert_or_assign - std::unordered_map::insert_or_assign
Synopsis¶
 template <class M>
  
   std::pair<iterator, bool> insert_or_assign( const Key& k,
    M&& obj (1) (since C++17)
  
   );
  
   template <class M> (2) (since C++17)
  
   std::pair<iterator, bool> insert_or_assign( Key&& k,
    M&& obj );
  
   template <class M>
  
   iterator insert_or_assign( const_iterator hint, const Key& k, M&&
    (3) (since C++17)
  
   obj );
  
   template <class M>
  
   iterator insert_or_assign( const_iterator hint, Key&& k, M&&
    obj (4) (since C++17)
  
   );
  
   1,3) If a key equivalent to 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))
  
   2,4) Same as (1,3), except the mapped value is constructed from
  
   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¶
 1,2) The bool component is 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
  
   3,4) Iterator pointing at the element that was inserted or updated
Complexity¶
 1,2) Same as for emplace
  
   3,4) Same as for emplace_hint
Notes¶
 insert_or_assign returns more information than operator[] and
    does not require
  
   default-constructibility of the mapped type.
  
   Feature-test macro: __cpp_lib_unordered_map_try_emplace
Example¶
// Run this code
  
   #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¶
 operator[] access or insert specified element
  
   (C++11) (public member function)
  
   at access specified element with bounds checking
  
   (C++11) (public member function)
  
   inserts elements
  
   insert or nodes
  
   (C++11) (since C++17)
  
   (public member function)
  
   emplace constructs element in-place
  
   (C++11) (public member function)
| 2022.07.31 | http://cppreference.com |