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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::move_backward - std::move_backward

Synopsis
	  template<  class BidirIt1, class BidirIt2 >			(since
       C++11)
	  BidirIt2 move_backward( BidirIt1 first, BidirIt1 last,       (const-
       expr since C++20)
	  BidirIt2 d_last );

	  Moves	the elements from the range [first, last),  to	another	 range
       ending at d_last.
	  The  elements	 are moved in reverse order (the last element is moved
       first), but their
	  relative order is preserved.

	  If d_last is within (first, last], the  behavior  is	undefined.  In
       this case,
	  std::move may	be used	instead.

Parameters
	  first, last		-	    the	range of the elements to move
	  d_last		-	    end	of the destination range

Type requirements
	  -
	  BidirIt1,  BidirIt2 must meet	the requirements of LegacyBidirection-
       alIterator.

Return value
	  Iterator in the destination range,  pointing	at  the	 last  element
       moved.

Complexity
	  Exactly std::distance(first, last) move assignments.

Possible implementation
	  template<class BidirIt1, class BidirIt2>
	  BidirIt2   move_backward(BidirIt1  first,  BidirIt1  last,  BidirIt2
       d_last)
	  {
	      while (first != last)
		  *(--d_last) =	std::move(*(--last));

	      return d_last;
	  }

Notes
	  When moving overlapping ranges, std::move is appropriate when	moving
       to the left
	  (beginning of	the destination	range is  outside  the	source	range)
       while
	  std::move_backward  is  appropriate when moving to the right (end of
       the destination
	  range	is outside the source range).

Example
       // Run this code

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

	using container	= std::vector<std::string>;

	void print(std::string_view comment, const container& src, const  con-
       tainer& dst = {})
	{
	    auto prn = [](std::string_view name, const container& cont)
	    {
		std::cout << name;
		for (const auto	&s : cont)
		    std::cout << (s.empty() ? "" : s.data()) <<	' ';
		std::cout << '\n';
	    };
	    std::cout << comment << '\n';
	    prn("src: ", src);
	    if (dst.empty())
		return;
	    prn("dst: ", dst);
	}

	int main()
	{
	    container src{"foo", "bar",	"baz"};
	    container dst{"qux", "quux", "quuz", "corge"};
	    print("Non-overlapping case; before	move_backward:", src, dst);
	    std::move_backward(src.begin(), src.end(), dst.end());
	    print("After:", src, dst);

	    src	= {"snap", "crackle", "pop", "lock", "drop"};
	    print("Overlapping case; before move_backward:", src);
	    std::move_backward(src.begin(),	std::next(src.begin(),	   3),
       src.end());
	    print("After:", src);
	}

Output:
	Non-overlapping	case; before move_backward:
	src: foo bar baz
	dst: qux quux quuz corge
	After:
	src:
	dst: qux foo bar baz
	Overlapping case; before move_backward:
	src: snap crackle pop lock drop
	After:
	src:   snap crackle pop

See also
	  move			moves a	range of elements to a new location
	  (C++11)		(function template)
	  ranges::move_backward	moves a	range of elements to a new location in
       backwards order
	  (C++20)		(niebloid)

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

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

home | help