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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::move_iterator - std::move_iterator

Synopsis
	  Defined in header <iterator>
	  template< class Iter >	(since C++11)
	  class	move_iterator;

	  std::move_iterator is	an iterator adaptor which behaves exactly like
       the underlying
	  iterator (which must be at least a LegacyInputIterator
	  or model input_iterator
	  (since C++20)
	  , or stronger	iterator concept
	  (since  C++23)),  except  that  dereferencing	converts the value re-
       turned by the
	  underlying iterator into an rvalue. If this iterator is used	as  an
       input iterator,
	  the  effect  is  that	 the values are	moved from, rather than	copied
       from.

Member functions
	  constructor		       constructs a new	iterator adaptor
	  (C++11)		       (public member function)
	  operator=		       assigns another iterator	adaptor
	  (C++11)		       (public member function)
	  base			       accesses	the underlying iterator
	  (C++11)		       (public member function)
	  operator*
	  operator->		       accesses	the pointed-to element
	  (C++11)		       (public member function)
	  (C++11)(deprecated in	C++20)
	  operator[]		       accesses	an element by index
	  (C++11)		       (public member function)
	  operator++
	  operator++(int)
	  operator+=
	  operator+		       advances	or decrements the iterator
	  operator--		       (public member function)
	  operator--(int)
	  operator-=
	  operator-
	  (C++11)

Non-member functions
	  operator==
	  operator!=
	  operator<
	  operator<=
	  operator>
	  operator>=
	  operator<=>			 compares the underlying iterators
	  (C++11)			 (function template)
	  (C++11)(removed in C++20)
	  (C++11)
	  (C++11)
	  (C++11)
	  (C++11)
	  (C++20)
	  operator==(std::move_sentinel) compares the underlying iterator  and
       the underlying
	  (C++20)			 sentinel
					 (function template)
	  operator+			 advances the iterator
	  (C++11)			 (function template)
	  operator-			 computes the distance between two it-
       erator adaptors
	  (C++11)			 (function template)
	  operator-(std::move_sentinel)	 computes the distance between the un-
       derlying	iterator
	  (C++20)			 and the underlying sentinel
					 (function template)
	  iter_move			 casts the result of dereferencing the
       underlying
	  (C++20)			  iterator  to	its  associated	rvalue
       reference type
					 (function)
	  iter_swap			 swaps the objects pointed to  by  two
       underlying
	  (C++20)			 iterators
					 (function template)
	  make_move_iterator		  creates a std::move_iterator of type
       inferred	from
	  (C++11)			 the argument
					 (function template)

	  Helper templates

	  template< class Iterator1, class Iterator2 >

	      requires (!std::sized_sentinel_for<Iterator1, Iterator2>)
	  constexpr		 bool		   disable_sized_sentinel_for<
       (since C++20)
	      std::move_iterator<Iterator1>,

	      std::move_iterator<Iterator2>> = true;

	  This	partial	specialization of std::disable_sized_sentinel_for pre-
       vents
	  specializations of move_iterator from	satisfying  sized_sentinel_for
       if their
	  underlying iterators do not satisfy the concept.

Notes
		Feature-test  macro	     Value    Std		  Fea-
       ture
	  __cpp_lib_move_iterator_concept 202207L (C++23) Make std::move_iter-
       ator<T*>	a random
							  access iterator

Example
       // Run this code

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

	void print(const std::string_view rem, const auto& v)
	{
	    std::cout << rem;
	    for	(const auto& s : v)
		std::cout << std::quoted(s) << ' ';
	    std::cout << '\n';
	};

	int main()
	{
	    std::vector<std::string> v{"this", "_", "is", "_", "an", "_", "ex-
       ample"};
	    print("Old contents	of the vector: ", v);
	    std::string	concat;
	    for	(auto begin = std::make_move_iterator(v.begin()),
		      end = std::make_move_iterator(v.end());
		 begin != end; ++begin)
	    {
		std::string temp{*begin}; // moves the contents	of  *begin  to
       temp
		concat += temp;
	    }

	    //	Starting  from C++17, which introduced class template argument
       deduction,
	    // the constructor of std::move_iterator can be used directly:
	    // std::string concat  =  std::accumulate(std::move_iterator(v.be-
       gin()),
	    //						      std::move_itera-
       tor(v.end()),
	    //					    std::string());

	    print("New contents	of the vector: ", v);
	    print("Concatenated	as  string:  ",	 std::ranges::single_view(con-
       cat));
	}

Possible output:
	Old contents of	the vector: "this" "_" "is" "_"	"an" "_" "example"
	New contents of	the vector: "" "" "" ""	"" "" ""
	Concatenated as	string:	"this_is_an_example"

	  Defect reports

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

	     DR	       Applied			 Behavior     as     published
       Correct behavior
		     to
			   dereferencing a move_iterator could return a
	  LWG	      2106	   C++11	   dangling	     reference
       returns the
			   if	the   dereferencing  the  underlying  iterator
       object instead
			   returns a prvalue
	  LWG	   3736	     C++20	  move_iterator	     was       missing
       added
			   disable_sized_sentinel_for specialization
			   member   iterator_category	was  defined  even  if
       iterator_category
	  P2259R1   C++20    std::iterator_traits<Iter>::iterator_category  is
       is
			   not					       defined
       not defined in
									     this
       case

See also
	  make_move_iterator creates a	std::move_iterator  of	type  inferred
       from the	argument
	  (C++11)	     (function template)
	  move_sentinel	     sentinel adaptor for use with std::move_iterator
	  (C++20)	     (class template)

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

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

home | help