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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::next_permutation - std::next_permutation

Synopsis
	  Defined in header <algorithm>
	  template< class BidirIt >
	  bool	next_permutation(  BidirIt  first,  BidirIt		(until
       C++20)
	  last );
	  template< class BidirIt >
	  constexpr  bool  next_permutation(  BidirIt  first,		(since
       C++20)
	  BidirIt last );				   (1)
	  template< class BidirIt, class Compare >
	  bool	     next_permutation(	     BidirIt	   first,      BidirIt
       (until C++20)
	  last,	Compare	comp );				       (2)
	  template< class BidirIt, class Compare >
	  constexpr	 bool	   next_permutation(	  BidirIt	first,
       (since C++20)
	  BidirIt last,	Compare	comp );

	  Permutes  the	 range	[first,	last) into the next permutation, where
       the set of all
	  permutations is ordered lexicographically with respect to  operator<
       or comp.	Returns
	  true	if  such a "next permutation" exists; otherwise	transforms the
       range into the
	  lexicographically first permutation (as if by	std::sort(first, last,
       comp)) and
	  returns false.

Parameters
	  first, last -	 the range of elements to permute
			 comparison function object (i.e. an object that  sat-
       isfies the
			 requirements  of  Compare)  which returns true	if the
       first argument
			 is less than 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 an	object
       of type BidirIt
			 can  be dereferenced and then implicitly converted to
       both of them.

Type requirements
	  -
	  BidirIt must meet the	requirements of	ValueSwappable and
	  LegacyBidirectionalIterator.

Return value
	  true if the new permutation is lexicographically  greater  than  the
       old. false if the
	  last	permutation  was  reached and the range	was reset to the first
       permutation.

Exceptions
	  Any exceptions thrown	from iterator operations or the	element	swap.

Complexity
	  At most N/2 swaps, where N =	std::distance(first,  last).  Averaged
       over the	entire
	  sequence  of	permutations, typical implementations use about	3 com-
       parisons	and 1.5
	  swaps	per call.

Notes
	  Implementations (e.g.	MSVC STL) may enable  vectorization  when  the
       iterator	type
	  satisfies LegacyContiguousIterator and swapping its value type calls
       neither
	  non-trivial special member function nor ADL-found swap.

Possible implementation
	  template<class BidirIt>
	  bool next_permutation(BidirIt	first, BidirIt last)
	  {
	    auto r_first = std::make_reverse_iterator(last);
	    auto r_last	= std::make_reverse_iterator(first);
	    auto left =	std::is_sorted_until(r_first, r_last);
	    if(left != r_last){
	      auto right = std::upper_bound(r_first, left, *left);
	      std::iter_swap(left, right);
	    }
	    std::reverse(left.base(), last);
	    return left	!= r_last;
	  }

Example
	  The following	code prints all	three permutations of the string "aba"

       // Run this code

	#include <algorithm>
	#include <string>
	#include <iostream>

	int main()
	{
	    std::string	s = "aba";
	    std::sort(s.begin(), s.end());
	    do {
		std::cout << s << '\n';
	    } while(std::next_permutation(s.begin(), s.end()));
	}

Output:
	aab
	aba
	baa

See also
	  is_permutation	    determines	if a sequence is a permutation
       of another
	  (C++11)		   sequence
				   (function template)
				   generates the  next	smaller	 lexicographic
       permutation of a
	  prev_permutation	   range of elements
				   (function template)
	  ranges::next_permutation  generates  the  next greater lexicographic
       permutation of a
	  (C++20)		   range of elements
				   (niebloid)

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

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

home | help