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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::set::emplace_hint -	std::set::emplace_hint

Synopsis
	  template			 <class...			 Args>
       (since C++11)
	  iterator emplace_hint( const_iterator	hint, Args&&...	args );

	  Inserts a new	element	into the container as close as possible	to the
       position	just
	  before hint. The element is constructed in-place, i.e.  no  copy  or
       move operations
	  are performed.

	  The constructor of the element is called with	exactly	the same argu-
       ments as	supplied
	  to the function, forwarded with std::forward<Args>(args)....

	  No iterators or references are invalidated.

Parameters
	  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
	  Returns an iterator to the newly inserted element.

	  If  the insertion failed because the element already exists, returns
       an iterator to
	  the already existing element with the	equivalent key.

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 in general,	but  amortized
       constant	if the
	  new element is inserted just before hint.

Example
       // Run this code

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

	const int n_operations = 100500;

	std::size_t set_emplace() {
	    std::set<int> set;
	    for(int i =	0; i < n_operations; ++i) {
		set.emplace(i);
	    }
	    return set.size();
	}

	std::size_t set_emplace_hint() {
	    std::set<int> set;
	    auto it = set.begin();
	    for(int i =	0; i < n_operations; ++i) {
		set.emplace_hint(it, i);
		it = set.end();
	    }
	    return set.size();
	}

	std::size_t set_emplace_hint_wrong() {
	    std::set<int> set;
	    auto it = set.begin();
	    for(int i =	n_operations; i	> 0; --i) {
		set.emplace_hint(it, i);
		it = set.end();
	    }
	    return set.size();
	}

	std::size_t set_emplace_hint_corrected() {
	    std::set<int> set;
	    auto it = set.begin();
	    for(int i =	n_operations; i	> 0; --i) {
		set.emplace_hint(it, i);
		it = set.begin();
	    }
	    return set.size();
	}

	std::size_t set_emplace_hint_closest() {
	    std::set<int> set;
	    auto it = set.begin();
	    for(int i =	0; i < n_operations; ++i) {
		it = set.emplace_hint(it, i);
	    }
	    return set.size();
	}

	void  timeit(std::function<std::size_t()> set_test, const char*	what =
       nullptr)	{
	    const auto start = std::chrono::system_clock::now();
	    const std::size_t setsize =	set_test();
	    const auto stop = std::chrono::system_clock::now();
	    const std::chrono::duration<double,	 std::milli>  time  =  stop  -
       start;
	    if (what !=	nullptr	&& setsize > 0)	{
		std::cout  <<  std::setw(6)  <<	time.count() <<	"  ms for " <<
       what << '\n';
	    }
	}

	int main() {
	    std::cout << std::fixed << std::setprecision(2);
	    timeit(set_emplace); // stack warmup
	    timeit(set_emplace,	"plain emplace");
	    timeit(set_emplace_hint, "emplace with correct hint");
	    timeit(set_emplace_hint_wrong, "emplace with wrong hint");
	    timeit(set_emplace_hint_corrected, "corrected emplace");
	    timeit(set_emplace_hint_closest, "emplace  using  returned	itera-
       tor");
	}

Possible output:
	 25.50	ms for plain emplace
	  9.79	ms for emplace with correct hint
	 28.49	ms for emplace with wrong hint
	  8.01	ms for corrected emplace
	  8.13	ms for emplace using returned iterator

See also
	  emplace constructs element in-place
	  (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_hint(3)

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

home | help