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

NAME
     std::set::insert - std::set::insert

Synopsis
	std::pair<iterator, bool> insert( const value_type&  (1)
	value );
	std::pair<iterator, bool> insert( value_type&& value (2) (since C++11)
	);
	iterator      insert(	   iterator	 pos,	   const     value_type&
     (until C++11)
	value );
	iterator	insert(        const_iterator	      pos,	   const
     (since C++11)
	value_type& value );
	iterator    insert(    const_iterator	pos,   value_type&&	     (4)
     (since C++11)
	value );
	template< class InputIt >				 (5)
	void insert( InputIt first, InputIt last );
	void   insert(	 std::initializer_list<value_type>   ilist    (3)    (6)
     (since C++11)
	);
	insert_return_type    insert(	 node_type&&   nh   );		     (7)
     (since C++17)
	iterator   insert(   const_iterator   pos,   node_type&&   nh	     (8)
     (since C++17)
	);
	template<    class    K    >					     (9)
     (since C++23)
	std::pair<iterator, bool> insert( K&& x );
	template<   class    K	  >					    (10)
     (since C++23)
	iterator insert( const_iterator pos, K&& x );

	Inserts  element(s) into the container, if the container doesn't already
     contain an
	element with an equivalent key.

	1,2) Inserts value.
	3,4) Inserts value in the position as close as possible to the	position
     just prior
	to pos.
	5)  Inserts  elements  from range [first, last). If multiple elements in
     the range have
	keys that compare equivalent, it is unspecified  which	element  is  in-
     serted (pending
	LWG2844).
	6) Inserts elements from initializer list ilist. If multiple elements in
     the range
	have  keys  that  compare equivalent, it is unspecified which element is
     inserted
	(pending LWG2844).
	7) If nh is an empty node handle, does nothing. Otherwise,  inserts  the
     element owned
	by  nh	into the container , if the container doesn't already contain an
     element with
	a key equivalent to nh.key(). The behavior is undefined  if  nh  is  not
     empty and
	get_allocator() != nh.get_allocator().
	8) If nh is an empty node handle, does nothing and returns the end iter-
     ator.
	Otherwise,  inserts  the  element owned by nh into the container, if the
     container
	doesn't already contain an element with a key  equivalent  to  nh.key(),
     and returns
	the iterator pointing to the element with key equivalent to nh.key()(re-
     gardless of
	whether  the  insert succeeded or failed). If the insertion succeeds, nh
     is moved
	from, otherwise it retains ownership of the element. The element is  in-
     serted as
	close as possible to the position just prior to pos. The behavior is un-
     defined if nh
	is not empty and get_allocator() != nh.get_allocator().
	9)  If	*this  already	contains an element which transparently compares
     equivalent to
	x, does nothing. Otherwise, constructs an object  u  of  the  value_type
     with
	std::forward<K>(x) and then inserts u into *this. If equal_range(u) ==
	equal_range(x)	is false, the behavior is undefined. The value_type must
     be
	EmplaceConstructible into set  from  std::forward<K>(x).  This	overload
     participates in
	overload  resolution only if the qualified-id Compare::is_transparent is
     valid and
	denotes a type. It allows calling this function without constructing  an
     instance of
	Key.
	10)  If  *this	already contains an element which transparently compares
     equivalent to
	x, does nothing. Otherwise, constructs an object  u  of  the  value_type
     with
	std::forward<K>(x)  and  then  inserts	u  into *this in the position as
     close as
	possible to the  position  just  prior	to  pos.  If  equal_range(u)  ==
     equal_range(x) is
	false,	the  behavior  is  undefined. The value_type must be EmplaceCon-
     structible into
	set from std::forward<K>(x). This overload participates in overload res-
     olution only
	if:
	  *  std::is_convertible_v<K&&,  const_iterator>  and	std::is_convert-
     ible_v<K&&,
	    iterator> are both false, and
	  *  the  qualified-id	Compare::is_transparent  is  valid and denotes a
     type,
	which together allows calling this function without constructing an  in-
     stance of Key.

	No iterators or references are invalidated.
	If  the  insertion is successful, pointers and references to the element
     obtained
	while it is held in the node handle are invalidated,  and  pointers  and
     references
	obtained to that element before it was extracted become valid.
	(since C++17)

Parameters
	pos	    - iterator to the position before which the new element will
     be inserted
	value	    - element value to insert
	first, last - range of elements to insert
	ilist	    - initializer list to insert the values from
	nh	    - a compatible node handle
	x	     -	a  value  of any type that can be transparently compared
     with a key

Type requirements
	-
	InputIt must meet the requirements of LegacyInputIterator.

Return value
	1,2) A pair consisting of an iterator to the inserted element (or to the
     element
	that prevented the insertion) and a bool value set to true if  and  only
     if the
	insertion took place.
	3,4)  An  iterator  to the inserted element, or to the element that pre-
     vented the
	insertion.
	5,6) (none)
	7) An object of insert_return_type with the members initialized as  fol-
     lows:
	  *  If  nh  is empty, inserted is false, position is end(), and node is
     empty.
	  * Otherwise if the insertion took place, inserted  is  true,	position
     points to the
	    inserted element, and node is empty.
	  *  If  the  insertion failed, inserted is false, node has the previous
     value of nh,
	    and position points to an element with a key equivalent to nh.key().
	8) End iterator if nh was empty, iterator pointing to the inserted  ele-
     ment if
	insertion  took  place,  and  iterator pointing to an element with a key
     equivalent to
	nh.key() if it failed.
	9) A pair consisting of an iterator to the inserted element (or  to  the
     element that
	prevented the insertion) and a bool value set to true if and only if the
     insertion
	took place.
	10)  An  iterator  to  the inserted element, or to the element that pre-
     vented the
	insertion.

Exceptions
	1-4) If an exception is thrown by any operation, the  insertion  has  no
     effect.

	 This section is incomplete
	 Reason: cases 5-8, 9, 10

Complexity
	1,2) Logarithmic in the size of the container, O(log(size())).
	3,4) Amortized constant if the insertion happens in the position just
	after
	(until C++11)
	before
	(since C++11) pos, logarithmic in the size of the container otherwise.
	5,6) O(NA.log(size() + N)), where N is the number of elements to insert.
	7) Logarithmic in the size of the container, O(log(size())).
	8)  Amortized constant if the insertion happens in the position just be-
     fore pos,
	logarithmic in the size of the container otherwise.
	9) Logarithmic in the size of the container, O(log(size())).
	10) Amortized constant if the insertion happens in the position just be-
     fore pos,
	logarithmic in the size of the container otherwise.

Notes
	The hinted insert (3,4) does not return a boolean in order to be
	signature-compatible with positional insert  on  sequential  containers,
     such as
	std::vector::insert.  This makes it possible to create generic inserters
     such as
	std::inserter. One way to check success of a hinted insert is to compare
     size()
	before and after.

	The overloads (5,6) are often implemented as a loop that calls the over-
     load (3) with
	end() as the hint; they are optimized for appending  a	sorted	sequence
     (such as
	another  std::set)  whose smallest element is greater than the last ele-
     ment in *this.

		     Feature-test     macro		       Value	     Std
     Feature
								      Heteroge-
     neous
								      overloads
     for the
								      remaining
     member
	__cpp_lib_associative_heterogeneous_insertion  202311L (C++26) functions
     in ordered
								      and    un-
     ordered
								      associa-
     tive
								      contain-
     ers. (9,10)

Example
     // Run this code

      #include <cassert>
      #include <iostream>
      #include <set>

      int main()
      {
	  std::set<int> set;

	  auto result_1 = set.insert(3);
	  assert(result_1.first != set.end()); // it is a valid iterator
	  assert(*result_1.first == 3);
	  if (result_1.second)
	      std::cout << "insert done\n";

	  auto result_2 = set.insert(3);
	  assert(result_2.first == result_1.first); // same iterator
	  assert(*result_2.first == 3);
	  if (!result_2.second)
	      std::cout << "no insertion\n";
      }

Output:
      insert done
      no insertion

	Defect reports

	The  following	behavior-changing  defect  reports were applied retroac-
     tively to
	previously published C++ standards.

	  DR	Applied to	   Behavior as	published		 Correct
     behavior
								  the  insertion
     is required
			   pos was just a hint, it could be	  to
	LWG 233 C++98	   totally ignored			  be as close as
     possible to
								  the
								  position  just
     prior to pos
			   the	complexity  of	overload (5) was     removed the
     linear
	LWG 264 C++98	   required to be linear if		  requirement
			   the range [first, last) is sorted	  in  this  spe-
     cial case
			   according to Compare
			   in the return value of overload (1),
	LWG 316 C++98	   it was not specified 		  success is
			   which  bool	value indicates a	    indicated by
     true
			   successful insertion

See also
	emplace      constructs element in-place
	(C++11)      (public member function)
	emplace_hint constructs elements in-place using a hint
	(C++11)      (public member function)
	inserter     creates a std::insert_iterator of type  inferred  from  the
     argument
		     (function template)

Category:
	  * Todo with reason

http://cppreference.com 	   2024.06.10		     std::set::insert(3)

home | help