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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::inplace_merge - std::inplace_merge

Synopsis
	  Defined in header <algorithm>
	  template< class BidirIt >
	  void inplace_merge( BidirIt first, BidirIt middle,	   (1) (const-
       expr since C++26)
	  BidirIt last );
	  template< class ExecutionPolicy, class BidirIt >

	  void	inplace_merge( ExecutionPolicy&& policy,	    (2)	(since
       C++17)

			      BidirIt first, BidirIt middle,
	  BidirIt last );
	  template< class BidirIt, class Compare >

	  void inplace_merge( BidirIt first, BidirIt middle,	   (3) (const-
       expr since C++26)
	  BidirIt last,

			      Compare comp );
	  template< class ExecutionPolicy, class BidirIt, class
	  Compare >

	  void inplace_merge( ExecutionPolicy&&	policy,		   (4)	(since
       C++17)
			      BidirIt first, BidirIt middle,
	  BidirIt last,

			      Compare comp );

	  Merges  two  consecutive  sorted ranges [first, middle) and [middle,
       last) into one
	  sorted range [first, last).

	  1) If	[first,	middle)	or [middle, last) is not sorted	 with  respect
       to
	  operator<
	  (until C++20)
	  std::less{}
	  (since C++20), the behavior is undefined.
	  3)  If  [first, middle) or [middle, last) is not sorted with respect
       to comp,	the
	  behavior is undefined.
	  2,4) Same as (1,3), but executed according to	policy.
	  These	overloads participate in overload resolution only if

	  std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>  is	 true.
       (until
										    C++20)
	  std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>  is
       true. (since
										    C++20)

	  This merge function is stable, which means that for equivalent  ele-
       ments in	the
	  original  two	 ranges, the elements from the first range (preserving
       their original
	  order) precede the elements from the second range (preserving	 their
       original	order).

	  If any of the	following conditions is	satisfied, the behavior	is un-
       defined:

	    * [first, middle) or [middle, last)	is not a valid range.
	    *  The  output  range  overlaps  with  [first, middle) or [middle,
       last).

	    * The type of *first is not	Swappable.	     (until C++11)
	    * BiditIt is not ValueSwappable.
	    * The type of *first is not	MoveConstructible.   (since C++11)
	    * The type of *first is not	MoveAssignable.

Parameters
	  first	  -  the beginning of the first	sorted range
	  middle  -  the end of	the first sorted range and  the	 beginning  of
       the second
	  last	  -  the end of	the second sorted range
	  policy  -  the execution policy to use. See execution	policy for de-
       tails.
		     comparison	function object	(i.e. an object	that satisfies
       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	equiv-
       alent 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 ac-
       cept all	values of
		     type (possibly const) Type1 and Type2 regardless 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 an object  of
       type BidirIt can
		     be	 dereferenced and then implicitly converted to both of
       them.

Type requirements
	  -
	  BidirIt must meet the	requirements of	LegacyBidirectionalIterator.
	  -
	  Compare must meet the	requirements of	Compare.

Complexity
	  Given	\(\scriptsize N\)N as std::distance(first, last):

	  1) Exactly \(\scriptsize N-1\)N-1 comparisons	using
	  operator<
	  (until C++20)
	  std::less{}
	  (since C++20)	if enough additional memory is	available,  \(\script-
       size O(N	\cdot
	  \log(N))\)O(Nlog(N)) comparisons otherwise.
	  2) \(\scriptsize O(N \cdot \log(N))\)O(Nlog(N)) comparisons using
	  operator<
	  (until C++20)
	  std::less{}
	  (since C++20).
	  3)  Exactly  \(\scriptsize  N-1\)N-1	applications of	the comparison
       function	comp if
	  enough additional  memory  is	 available,  \(\scriptsize  O(N	 \cdot
       \log(N))\)O(Nlog(N))
	  applications otherwise.
	  4)  \(\scriptsize O(N	\cdot \log(N))\)O(Nlog(N)) applications	of the
       comparison
	  function comp.

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.

Possible implementation
	  See the implementations in libstdc++ and libc++.

Notes
	  This	function attempts to allocate a	temporary buffer. If the allo-
       cation fails, the
	  less efficient algorithm is chosen.

		Feature-test macro	  Value	   Std		  Feature
	  __cpp_lib_constexpr_algorithms  202306L  (C++26)  constexpr  inplace
       merging

Example
	  The following	code is	an implementation of merge sort.

       // Run this code

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

	template<class Iter>
	void merge_sort(Iter first, Iter last)
	{
	    if (last - first > 1)
	    {
		Iter middle = first + (last - first) / 2;
		merge_sort(first, middle);
		merge_sort(middle, last);
		std::inplace_merge(first, middle, last);
	    }
	}

	int main()
	{
	    std::vector<int> v{8, 2, -2, 0, 11,	11, 1, 7, 3};
	    merge_sort(v.begin(), v.end());
	    for	(const auto& n : v)
		std::cout << n << ' ';
	    std::cout << '\n';
	}

Output:
	-2 0 1 2 3 7 8 11 11

See also
	  merge			merges two sorted ranges
				(function template)
	  sort			sorts a	range into ascending order
				(function template)
				sorts a	range of elements while	preserving or-
       der between equal
	  stable_sort		elements
				(function template)
	  ranges::inplace_merge	merges two ordered ranges in-place
	  (C++20)		(niebloid)

http://cppreference.com		  2024.06.10		 std::inplace_merge(3)

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

home | help