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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::set_union -	std::set_union

Synopsis
	  Defined in header <algorithm>
	  template< class InputIt1, class InputIt2, class
	  OutputIt >

	  OutputIt  set_union(	InputIt1  first1,  InputIt1		(until
       C++20)
	  last1,
	  InputIt2 first2, InputIt2 last2,

	  OutputIt d_first );
	  template< class InputIt1, class InputIt2, class
	  OutputIt >

	  constexpr  OutputIt  set_union(  InputIt1  first1,		(since
       C++20)
	  InputIt1 last1,
	  InputIt2 first2, InputIt2 last2,

	  OutputIt d_first );
	  template< class ExecutionPolicy, class
	  ForwardIt1, class ForwardIt2,	class ForwardIt3 >

	  ForwardIt3  set_union(  ExecutionPolicy&&  policy,	   (2)	(since
       C++17)
	  ForwardIt1 first1, ForwardIt1	last1,
	  ForwardIt2 first2, ForwardIt2	last2,

	  ForwardIt3 d_first );
	  template< class InputIt1, class InputIt2,	   (1)

	  class	OutputIt, class	Compare	>
	  OutputIt	set_union(	 InputIt1	first1,	      InputIt1
       (until C++20)
	  last1,
	  InputIt2 first2, InputIt2 last2,

	  OutputIt d_first, Compare comp );
	  template< class InputIt1, class InputIt2,

	  class	OutputIt, class	Compare	>
	  constexpr	  OutputIt	 set_union(	 InputIt1      first1,
       (since C++20)
	  InputIt1 last1,				       (3)
	  InputIt2 first2, InputIt2 last2,

	  OutputIt d_first, Compare comp );
	  template< class ExecutionPolicy,

	  class	ForwardIt1, class ForwardIt2,
	  class	ForwardIt3, class Compare >
	  ForwardIt3   set_union(   ExecutionPolicy&&	policy,		   (4)
       (since C++17)
	  ForwardIt1 first1, ForwardIt1	last1,
	  ForwardIt2 first2, ForwardIt2	last2,

	  ForwardIt3 d_first, Compare comp );

	  Constructs a sorted union beginning at d_first consisting of the set
       of elements
	  present  in  one  or both sorted ranges [first1, last1) and [first2,
       last2).

	  If some element is found m times in [first1, last1) and n  times  in
       [first2,	last2),
	  then	all m elements will be copied from [first1, last1) to d_first,
       preserving
	  order, and then exactly std::max(n-m,	0)  elements  will  be	copied
       from [first2,
	  last2) to d_first, also preserving order.

	  The resulting	range cannot overlap with either of the	input ranges.

	  1)  Elements	are  compared  using  operator<	and the	ranges must be
       sorted with respect
	  to the same.
	  3) Elements are compared using the given binary comparison  function
       comp and	the
	  ranges must be sorted	with respect to	the same.
	  2,4)	Same  as  (1,3), but executed according	to policy. These over-
       loads do	not
	  participate in overload resolution unless
	  std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>
	  (until C++20)
	  std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
	  (since C++20)	is true.

Parameters
	  first1, last1	- the first input sorted range
	  first2, last2	- the second input sorted range
	  d_first	- the beginning	of the output range
	  policy	- the execution	policy to use.	See  execution	policy
       for details.
			  comparison function object (i.e. an object that sat-
       isfies the
			  requirements	of  Compare) which returns true	if the
       first argument
			  is less than (i.e. is	ordered	before)	the second.

			  The signature	of the comparison function  should  be
       equivalent to the
			  following:

			  bool cmp(const Type1 &a, const Type2 &b);
	  comp		-
			  While	 the  signature	does not need to have const &,
       the function must
			  not modify the objects passed	to it and must be able
       to accept all
			  values of type (possibly const) Type1	and Type2  re-
       gardless	of value
			  category (thus, Type1	& is not allowed
			  , nor	is Type1 unless	for Type1 a move is equivalent
       to a copy
			  (since C++11)).
			  The  types Type1 and Type2 must be such that objects
       of types
			  InputIt1 and InputIt2	can be dereferenced  and  then
       implicitly
			  converted to both Type1 and Type2.

Type requirements
	  -
	  InputIt1,  InputIt2  must meet the requirements of LegacyInputItera-
       tor.
	  -
	  ForwardIt1, ForwardIt2, ForwardIt3 must meet the requirements	of
	  LegacyForwardIterator.
	  -
	  OutputIt must	meet the requirements of LegacyOutputIterator.

Return value
	  Iterator past	the end	of the constructed range.

Complexity
	  At most \(\scriptsize	2\cdot(N_1+N_2)-1\)2(N
	  1+N
	  2)-1 comparisons, where \(\scriptsize	N_1\)N
	  1 and	\(\scriptsize N_2\)N
	  2 are	std::distance(first1, last1) and std::distance(first2, last2),
       respectively.

Exceptions
	  The overloads	with a template	parameter named	ExecutionPolicy	report
       errors as
	  follows:

	    * If execution of a	function invoked  as  part  of	the  algorithm
       throws an exception
	      and ExecutionPolicy is one of the	standard policies, std::termi-
       nate is called.
	      For  any	other ExecutionPolicy, the behavior is implementation-
       defined.
	    * If the algorithm fails to	 allocate  memory,  std::bad_alloc  is
       thrown.

Notes
	  This algorithm performs a similar task as std::merge does. Both con-
       sume two	sorted
	  input	ranges and produce a sorted output with	elements from both in-
       puts. The
	  difference between these two algorithms is with handling values from
       both input
	  ranges  which	 compare equivalent (see notes on LessThanComparable).
       If any equivalent
	  values appeared n times in the first range and m times in  the  sec-
       ond, std::merge
	  would	output all n+m occurrences whereas std::set_union would	output
       std::max(n, m)
	  ones	only.  So  std::merge  outputs	exactly	 std::distance(first1,
       last1) +
	  std::distance(first2,	last2) values and std::set_union  may  produce
       fewer.

Possible implementation
First version
       template<class  InputIt1,  class	 InputIt2,  class  OutputIt>  OutputIt
       set_union(InputIt1 first1, InputIt1 last1,
			  InputIt2 first2, InputIt2 last2,
			  OutputIt d_first) {
	   for (; first1 != last1; ++d_first) {
	       if (first2 == last2)
		   return std::copy(first1, last1, d_first);
	       if (*first2 < *first1) {
		   *d_first = *first2++;
	       } else {
		   *d_first = *first1;
		   if (!(*first1 < *first2))
		       ++first2;
		   ++first1;
	       }
	   }
	   return std::copy(first2, last2, d_first); }

Second version
       template<class InputIt1,	class InputIt2,
		class OutputIt,	 class	Compare>  OutputIt  set_union(InputIt1
       first1, InputIt1	last1,
			  InputIt2 first2, InputIt2 last2,
			  OutputIt d_first, Compare comp) {
	   for (; first1 != last1; ++d_first) {
	       if (first2 == last2) {
		   // Finished range 2,	include	the rest of range 1:
		   return std::copy(first1, last1, d_first);
	       }
	       if (comp(*first2, *first1)) {
		   *d_first = *first2++;
	       } else {
		   *d_first = *first1;
		   if  (!comp(*first1, *first2)) { // Equivalent => don't need
       to include *first2.
		       ++first2;
		   }
		   ++first1;
	       }
	   }
	   // Finished range 1,	include	the rest of range 2:
	   return std::copy(first2, last2, d_first); }

Example
	  Example with vectors :

       // Run this code

	#include <vector>
	#include <iostream>
	#include <algorithm>
	#include <iterator>

	int main()
	{
	    {
		std::vector<int> v1 = {1, 2, 3,	4, 5};
		std::vector<int> v2 = {	     3,	4, 5, 6, 7};
		std::vector<int> dest1;

		std::set_union(v1.begin(), v1.end(),
			       v2.begin(), v2.end(),
			       std::back_inserter(dest1));

		for (const auto	&i : dest1) {
		    std::cout << i << '	';
		}
		std::cout << '\n';
	    }
	    {
		std::vector<int> v1 = {1, 2, 3,	4, 5, 5, 5};
		std::vector<int> v2 = {	     3,	4, 5, 6, 7};
		std::vector<int> dest1;

		std::set_union(v1.begin(), v1.end(),
			       v2.begin(), v2.end(),
			       std::back_inserter(dest1));

		for (const auto	&i : dest1) {
		    std::cout << i << '	';
		}
		std::cout << '\n';
	    }
	}

Output:
	1 2 3 4	5 6 7
	1 2 3 4	5 5 5 6	7

See also
	  includes		   returns true	if one sequence	 is  a	subse-
       quence of another
				   (function template)
	  merge			   merges two sorted ranges
				   (function template)
	  set_difference	   computes the	difference between two sets
				   (function template)
	  set_intersection	   computes the	intersection of	two sets
				   (function template)
	  set_symmetric_difference  computes  the symmetric difference between
       two sets
				   (function template)
	  ranges::set_union	   computes the	union of two sets
	  (C++20)		   (niebloid)

http://cppreference.com		  2022.07.31		     std::set_union(3)

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

home | help