std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::insert_or_assign - cppreference.com (original) (raw)

template< class M > std::pair<iterator, bool> insert_or_assign( const key_type& k, M&& obj ); (1) (since C++23)
template< class M > std::pair<iterator, bool> insert_or_assign( key_type&& k, M&& obj ); (2) (since C++23)
template< class K, class M > std::pair<iterator, bool> insert_or_assign( K&& k, M&& obj ); (3) (since C++23)
template< class M >iterator insert_or_assign( const_iterator hint, const key_type& k, M&& obj ); (4) (since C++23)
template< class M >iterator insert_or_assign( const_iterator hint, key_type&& k, M&& obj ); (5) (since C++23)
template< class K, class M >iterator insert_or_assign( const_iterator hint, K&& k, M&& obj ); (6) (since C++23)

The conversion from k into key_type must construct an object u, for which find(k) == find(u) is true. Otherwise, the behavior is undefined.

[edit] 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

[edit] Return value

1-3) 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.

4-6) Iterator pointing at the element that was inserted or updated.

[edit] Complexity

[edit] Notes

insert_or_assign returns more information than operator[] and does not require default-constructibility of the mapped type.

[edit] Example

#include #include #include   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::flat_map<std::string, std::string> map;   print_result(map.insert_or_assign("a", "apple")); print_result(map.insert_or_assign("b", "banana")); print_result(map.insert_or_assign("c", "cherry")); print_result(map.insert_or_assign("c", "clementine"));   for (const auto& node : map) print_node(node); }

Output:

inserted: [a] = apple inserted: [b] = banana inserted: [c] = cherry assigned: [c] = clementine [a] = apple [b] = banana [c] = clementine

[edit] See also

| | access or insert specified element (public member function) [edit] | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | | access specified element with bounds checking (public member function) [edit] | | | inserts elements (public member function) [edit] | | | constructs element in-place (public member function) [edit] | | | inserts in-place if the key does not exist, does nothing if the key exists (public member function) [edit] |