std::prev_permutation
| 헤더 <algorithm>
|
||
template< class BidirIt >
bool prev_permutation( BidirIt first, BidirIt last );
|
에 정의됨 (1) | (C++20부터 constexpr) |
template< class BidirIt, class Compare >
bool prev_permutation( BidirIt first, BidirIt last, Compare comp );
|
(2) | (C++20부터 constexpr) |
범위 [first, last)를 이전 순열로 변환합니다. 해당 순열이 존재하면 true을 반환하고, 그렇지 않으면 범위를 마지막 순열(내림차순)로 변환하고 false을 반환합니다.
operator<(C++20까지)std::less{}(C++20부터)에 대해 사전식으로 정렬됩니다.comp에 대해 사전식으로 정렬됩니다.만약 의 유형이 *first이(가) Swappable(C++11까지)BidirIt이(가) ValueSwappable(C++11부터)이 아니면, 동작은 정의되지 않습니다.
매개변수
| first, last | - | 순열을 생성할 요소들의 범위 를 정의하는 반복자 쌍 |
| comp | - |
비교 함수 객체(즉
Compare
요구 사항을 만족하는 객체)로, 첫 번째 인수가 두 번째 인수보다
작은
경우
true
를 반환함.
비교 함수의 시그니처는 다음과 동일해야 함: bool cmp ( const Type1 & a, const Type2 & b ) ;
시그니처에
const
&
가 필요하지는 않지만, 함수는 전달된 객체를 수정해서는 안 되며
값 범주
에 관계없이 (가능한 const)
|
| 타입 요구 사항 | ||
-
BidirIt
는
ValueSwappable
및
LegacyBidirectionalIterator
요구 사항을 충족해야 함.
|
||
반환값
true 새로운 순열이 사전식 순서에서 이전 순열보다 앞서는 경우. false 첫 번째 순열에 도달했고 범위가 마지막 순열로 재설정된 경우.
예외
반복자 연산 또는 요소 교체에서 발생하는 모든 예외.
복잡도
주어진 N 이 std:: distance ( first, last ) 인 경우:
| N |
| 2 |
가능한 구현
template<class BidirIt> bool prev_permutation(BidirIt first, BidirIt last) { if (first == last) return false; BidirIt i = last; if (first == --i) return false; while (1) { BidirIt i1, i2; i1 = i; if (*i1 < *--i) { i2 = last; while (!(*--i2 < *i)) ; std::iter_swap(i, i2); std::reverse(i1, last); return true; } if (i == first) { std::reverse(first, last); return false; } } } |
참고 사항
전체 순열 시퀀스에 걸쳐 평균적으로, 일반적인 구현은 호출당 약 3회의 비교와 1.5회의 스왑을 사용합니다.
구현체들(예:
MSVC STL
)은 반복자 타입이
LegacyContiguousIterator
를 만족하고 그 값 타입의 스왑 작업이 비트리비얼 특수 멤버 함수를 호출하지 않으며
ADL
에서 발견된
swap
을 호출하지 않을 때 벡터화를 활성화할 수 있습니다.
예제
다음 코드는 문자열 "cab" 의 여섯 가지 모든 순열을 역순으로 출력합니다.
#include <algorithm> #include <iostream> #include <string> int main() { std::string s = "cab"; do { std::cout << s << ' '; } while (std::prev_permutation(s.begin(), s.end())); std::cout << s << '\n'; }
출력:
cab bca bac acb abc cba
같이 보기
(C++11) |
시퀀스가 다른 시퀀스의 순열인지 확인한다 (함수 템플릿 & 알고리즘 함수 객체) |
(C++20) |
|
| 요소 범위의 사전식 순서에서 다음으로 큰 순열을 생성한다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20) |
|
(C++20) |
요소 범위의 사전식 순서에서 다음으로 작은 순열을 생성한다 (알고리즘 함수 객체) |