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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::rotate_copy	- std::rotate_copy

Synopsis
	  Defined in header <algorithm>
	  template< class ForwardIt, class OutputIt >

	  OutputIt    rotate_copy(   ForwardIt	 first,	  ForwardIt   n_first,
       (until C++20)

	  ForwardIt last, OutputIt d_first );
	  template< class ForwardIt, class OutputIt >

	  constexpr   OutputIt	 rotate_copy(	ForwardIt   first,   ForwardIt
       (since C++20)
	  n_first,							 (1)

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

	  ForwardIt2	    rotate_copy(       ExecutionPolicy&&       policy,
       (2) (since C++17)
	  ForwardIt1 first, ForwardIt1 n_first,

	  ForwardIt1 last, ForwardIt2 d_first );

	  1) Copies the	elements from the  range  [first,  last),  to  another
       range beginning at
	  d_first in such a way, that the element *(n_first) becomes the first
       element of the
	  new range and	*(n_first - 1) becomes the last	element.
	  The  behavior	 is  undefined if either [first, n_first) or [n_first,
       last) is	not a
	  valid	range, or the source and destination ranges overlap.
	  2) Same as (1), but executed according to policy. This overload does
       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
	  first, last -	the range of elements to copy
	  n_first     -	an iterator to an element in [first, last) that	should
       appear at the
			beginning of the new range
	  d_first     -	beginning of the destination range
	  policy      -	the execution policy to	use. See execution policy  for
       details.

Type requirements
	  -
	  ForwardIt, ForwardIt1, ForwardIt2 must meet the requirements of
	  LegacyForwardIterator.
	  -
	  OutputIt must	meet the requirements of LegacyOutputIterator.

Return value
	  Output iterator to the element past the last element copied.

Complexity
	  linear in the	distance between first and last.

Exceptions
	  The overload with a template parameter named ExecutionPolicy reports
       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 also the implementations in libstdc++, libc++, and MSVC STL.

	  template<class ForwardIt, class OutputIt>
	  constexpr // since C++20
	  OutputIt rotate_copy(ForwardIt first,	ForwardIt n_first,
				     ForwardIt last, OutputIt d_first)
	  {
	      d_first =	std::copy(n_first, last, d_first);
	      return std::copy(first, n_first, d_first);
	  }

Example
       // Run this code

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

	int main()
	{
	    std::vector<int> src = {1, 2, 3, 4,	5};
	    std::vector<int> dest(src.size());
	    auto pivot = std::find(src.begin(),	src.end(), 3);

	    std::rotate_copy(src.begin(), pivot, src.end(), dest.begin());
	    for	(int i : dest) {
		std::cout << i << ' ';
	    }
	    std::cout << '\n';

	    // copy the	rotation result	directly to the	std::cout
	    pivot = std::find(dest.begin(), dest.end(),	1);
	    std::rotate_copy(dest.begin(), pivot, dest.end(),
			     std::ostream_iterator<int>(std::cout, " "));
	    std::cout << '\n';
	}

Output:
	3 4 5 1	2
	1 2 3 4	5

See also
	  rotate	      rotates the order	of elements in a range
			      (function	template)
	  ranges::rotate_copy copies and rotate	a range	of elements
	  (C++20)	      (niebloid)

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

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

home | help