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

FreeBSD Manual Pages

  
 
  

home | help
std::set::emplace(3)	      C++ Standard Libary	  std::set::emplace(3)

NAME
       std::set::emplace - std::set::emplace

Synopsis
	  template< class... Args >			       (since C++11)
	  std::pair<iterator,bool> emplace( Args&&... args );

	  Inserts  a  new element into the container constructed in-place with
       the given args if
	  there	is no element with the key in the container.

	  Careful use of emplace allows	the  new  element  to  be  constructed
       while avoiding
	  unnecessary copy or move operations. The constructor of the new ele-
       ment is called
	  with	exactly	 the  same arguments as	supplied to emplace, forwarded
       via
	  std::forward<Args>(args).... The element may be constructed even  if
       there already is
	  an  element  with  the key in	the container, in which	case the newly
       constructed
	  element will be destroyed immediately.

	  No iterators or references are invalidated.

Parameters
	  args - arguments to forward to the constructor of the	element

Return value
	  Returns a pair consisting of an iterator to the inserted element, or
       the
	  already-existing element if no insertion happened, and a bool	denot-
       ing whether the
	  insertion took place (true if	insertion happened, false  if  it  did
       not).

Exceptions
	  If an	exception is thrown by any operation, this function has	no ef-
       fect (strong
	  exception guarantee).

Complexity
	  Logarithmic in the size of the container.

Example
       // Run this code

	#include <chrono>
	#include <functional>
	#include <iomanip>
	#include <iostream>
	#include <set>
	#include <string>

	class Dew
	{
	  private:
	    int	a;
	    int	b;
	    int	c;

	  public:
	    Dew(int _a,	int _b,	int _c)
	      :	a(_a), b(_b), c(_c)
	    {}

	    bool operator<(const Dew &other) const
	    {
	      if (a < other.a)
		return true;
	      if (a == other.a && b < other.b)
		return true;
	      return (a	== other.a && b	== other.b && c	< other.c);
	    }
	};

	const int nof_operations = 120;

	int set_emplace() {
	    std::set<Dew> set;
	    for(int i =	0; i < nof_operations; ++i)
		for(int	j = 0; j < nof_operations; ++j)
		    for(int k =	0; k < nof_operations; ++k)
		      set.emplace(i, j,	k);

	    return set.size();
	}

	int set_insert() {
	    std::set<Dew> set;
	    for(int i =	0; i < nof_operations; ++i)
		for(int	j = 0; j < nof_operations; ++j)
		    for(int k =	0; k < nof_operations; ++k)
		      set.insert(Dew(i,	j, k));

	    return set.size();
	}

	void timeit(std::function<int()> set_test, std::string what = "") {
	  auto start = std::chrono::system_clock::now();
	  int setsize =	set_test();
	  auto stop = std::chrono::system_clock::now();
	  std::chrono::duration<double,	std::milli> time = stop	- start;
	  if (what.size() > 0 && setsize > 0) {
	    std::cout << std::fixed << std::setprecision(2)
		<< time.count()	<< "  ms for " << what << '\n';
	  }
	}

	int main()
	{
	  set_insert();
	  timeit(set_insert, "insert");
	  timeit(set_emplace, "emplace");
	  timeit(set_insert, "insert");
	  timeit(set_emplace, "emplace");
	}

Possible output:
	638.45	ms for insert
	619.44	ms for emplace
	609.43	ms for insert
	652.55	ms for emplace

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

http://cppreference.com		  2022.07.31		  std::set::emplace(3)

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

home | help