Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::unorde...:try_emplace(3) C++ Standard Libarystd::unorde...:try_emplace(3)

NAME
       std::unordered_map::try_emplace - std::unordered_map::try_emplace

Synopsis
	  template< class... Args >
	  std::pair<iterator,  bool>  try_emplace(  const  Key&	 k,  Args&&...
       (1) (since C++17)
	  args );
	  template<		  class...		 Args		     >
       (2) (since C++17)
	  std::pair<iterator, bool> try_emplace( Key&& k, Args&&... args );
	  template<	   class	K,	  class...	  Args	     >
       (3) (since C++26)
	  std::pair<iterator, bool> try_emplace( K&& k,	Args&&... args );
	  template< class... Args >
	  iterator try_emplace(	const_iterator hint, const Key&	 k,  Args&&...
       (4) (since C++17)
	  args );
	  template< class... Args >
	  iterator  try_emplace(  const_iterator hint, Key&& k,	Args&&... args
       (5) (since C++17)
	  );
	  template< class K, class... Args >
	  iterator try_emplace(	const_iterator hint,  K&&  k,  Args&&...  args
       (6) (since C++26)
	  );

	  If a key equivalent to k already exists in the container, does noth-
       ing. Otherwise,
	  inserts  a  new element into the container with key k	and value con-
       structed	with args.
	  In such case:

	  1) Behaves like emplace except that the element is constructed as
	  value_type(std::piecewise_construct,

		     std::forward_as_tuple(k),

		     std::forward_as_tuple(std::forward<Args>(args)...))
	  2) Behaves like emplace except that the element is constructed as
	  value_type(std::piecewise_construct,

		     std::forward_as_tuple(std::move(k)),

		     std::forward_as_tuple(std::forward<Args>(args)...))
	  3) Behaves like emplace except that the element is constructed as
	  value_type(std::piecewise_construct,

		     std::forward_as_tuple(std::forward<K>(k)),

		     std::forward_as_tuple(std::forward<Args>(args)...))
	  4) Behaves like emplace_hint except that the element is  constructed
       as
	  value_type(std::piecewise_construct,

		     std::forward_as_tuple(k),

		     std::forward_as_tuple(std::forward<Args>(args)...))
	  5)  Behaves like emplace_hint	except that the	element	is constructed
       as
	  value_type(std::piecewise_construct,

		     std::forward_as_tuple(std::move(k)),

		     std::forward_as_tuple(std::forward<Args>(args)...))
	  6) Behaves like emplace_hint except that the element is  constructed
       as
	  value_type(std::piecewise_construct,

		     std::forward_as_tuple(std::forward<K>(k)),

		     std::forward_as_tuple(std::forward<Args>(args)...))
	  1-6)	If  value_type	is not EmplaceConstructible into unordered_map
       from the
	  corresponding	expression, the	behavior is undefined.
	  3) This overload participates	in overload  resolution	 only  if  all
       following
	  conditions are satisfied:
	    *  std::is_convertible_v<K&&, const_iterator> and std::is_convert-
       ible_v<K&&,
	      iterator>	are both false.
	    * Hash::is_transparent and KeyEqual::is_transparent	are valid  and
       each denotes a
	      type.
	  If	hash_function()(u.first)   !=	hash_function()(k)   ||	  con-
       tains(u.first) is true, the
	  behavior is undefined, where u is the	new element to be inserted.
	  6)  This  overload  participates  in	overload  resolution  only  if
       Hash::is_transparent
	  and KeyEqual::is_transparent are both	valid and each denotes a type.
	  If	hash_function()(u.first)   !=	hash_function()(k)   ||	  con-
       tains(u.first) is true, the
	  behavior is undefined, where u is the	new element to be inserted.

	  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	inval-
       idated. 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
	  args - arguments to forward to the constructor of the	element

Return value
	  1-3) Same as for emplace.
	  4-6) Same as for emplace_hint.

Complexity
	  1-3) Same as for emplace.
	  4-6) Same as for emplace_hint.

Notes
	  Unlike  insert  or  emplace, these functions do not move from	rvalue
       arguments if the
	  insertion does not happen, which makes it easy  to  manipulate  maps
       whose values are
	  move-only    types,	 such	 as    std::unordered_map<std::string,
       std::unique_ptr<foo>>. In
	  addition, try_emplace	treats	the  key  and  the  arguments  to  the
       mapped_type
	  separately,  unlike  emplace,	 which	requires the arguments to con-
       struct a	value_type
	  (that	is, a std::pair).

	  Overloads (3,6) can be called	without	constructing an	object of type
       Key.

		    Feature-test     macro		      Value	   Std
       Feature	__cpp_lib_unordered_map_try_emplace	       201411L (C++17)
       std::unordered_map::try_emplace,
								     std::un-
       ordered_map::insert_or_assign
								     Heteroge-
       neous overloads for  the	 __cpp_lib_associative_heterogeneous_insertion
       202311L (C++26) remaining member	functions in
								     ordered
       and unordered associative
								     contain-
       ers. Overloads (3) and (6).

Example
       // Run this code

	#include <iostream>
	#include <string>
	#include <unordered_map>
	#include <utility>

	void print_node(const auto& node)
	{
	    std::cout << '[' <<	node.first << "] = " <<	node.second << '\n';
	}

	void print_result(auto const& pair)
	{
	    std::cout << (pair.second ?	"inserted: " : "ignored:  ");
	    print_node(*pair.first);
	}

	int main()
	{
	    using namespace std::literals;
	    std::unordered_map<std::string, std::string> m;

	    print_result(m.try_emplace("a", "a"s));
	    print_result(m.try_emplace("b", "abcd"));
	    print_result(m.try_emplace("c", 10,	'c'));
	    print_result(m.try_emplace("c", "Won't be inserted"));

	    for	(const auto& p : m)
		print_node(p);
	}

Possible output:
	inserted: [a] =	a
	inserted: [b] =	abcd
	inserted: [c] =	cccccccccc
	ignored:  [c] =	cccccccccc
	[a] = a
	[b] = abcd
	[c] = cccccccccc

See also
	  emplace      constructs element in-place
		       (public member function)
	  emplace_hint constructs elements in-place using a hint
		       (public member function)
		       inserts elements
	  insert       or nodes
		       (since C++17)
		       (public member function)

http://cppreference.com		  2024.06.10	 std::unorde...:try_emplace(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::unordered_map::try_emplace&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help