std::ranges:: shuffle
std::ranges
| Non-modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Partitioning operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sorting operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Binary search operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Set operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Heap operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Minimum/maximum operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Permutation operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fold operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Return types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더에 정의됨
<algorithm>
|
||
|
호출 서명
|
||
|
template
<
std::
random_access_iterator
I,
std::
sentinel_for
<
I
>
S,
class
Gen
>
requires
std::
permutable
<
I
>
&&
|
(1) | (C++20부터) |
|
template
<
ranges::
random_access_range
R,
class
Gen
>
requires
std::
permutable
<
ranges::
iterator_t
<
R
>>
&&
|
(2) | (C++20부터) |
[
first
,
last
)
내의 요소들을 재정렬하여, 가능한 모든 순열이 동일한 확률로 나타나도록 합니다.
이 페이지에서 설명하는 함수형 개체들은 algorithm function objects (일반적으로 niebloids 로 알려진)입니다. 즉:
- 명시적 템플릿 인수 목록은 이들 중 어느 것을 호출할 때도 지정할 수 없습니다.
- 이들 중 어느 것도 인수 의존 이름 검색 에 보이지 않습니다.
- 이들 중 어느 것이 일반 비한정 이름 검색 에 의해 함수 호출 연산자의 왼쪽 이름으로 발견될 때, 인수 의존 이름 검색 이 억제됩니다.
목차 |
매개변수
| first, last | - | 무작위로 섞을 요소들의 범위 를 정의하는 반복자-감시자 쌍 |
| r | - | 무작위로 섞을 요소들의 범위 |
| gen | - | 난수 생성기 |
반환값
last 와 동일한 반복자.
복잡도
정확히 ( last - first ) - 1 번의 교환.
가능한 구현
struct shuffle_fn { template<std::random_access_iterator I, std::sentinel_for<I> S, class Gen> requires std::permutable<I> && std::uniform_random_bit_generator<std::remove_reference_t<Gen>> I operator()(I first, S last, Gen&& gen) const { using diff_t = std::iter_difference_t<I>; using distr_t = std::uniform_int_distribution<diff_t>; using param_t = typename distr_t::param_type; distr_t D; const auto n {last - first}; for (diff_t i {1}; i < n; ++i) ranges::iter_swap(first + i, first + D(gen, param_t(0, i))); return ranges::next(first, last); } template<ranges::random_access_range R, class Gen> requires std::permutable<ranges::iterator_t<R>> && std::uniform_random_bit_generator<std::remove_reference_t<Gen>> ranges::borrowed_iterator_t<R> operator()(R&& r, Gen&& gen) const { return (*this)(ranges::begin(r), ranges::end(r), std::forward<Gen>(gen)); } }; inline constexpr shuffle_fn shuffle {}; |
예제
#include <algorithm> #include <array> #include <iostream> #include <random> void print(const auto& a) { for (const auto e : a) std::cout << e << ' '; std::cout << '\n'; } int main() { std::array a {'A', 'B', 'C', 'D', 'E', 'F'}; print(a); std::random_device rd; std::mt19937 gen {rd()}; for (int i {}; i != 3; ++i) { std::ranges::shuffle(a, gen); print(a); } }
가능한 출력:
A B C D E F F E A C D B E C B F A D B A E C F D
참고 항목
|
(C++20)
|
요소 범위의 다음으로 큰 사전식 순열을 생성함
(알고리즘 함수 객체) |
|
(C++20)
|
요소 범위의 다음으로 작은 사전식 순열을 생성함
(알고리즘 함수 객체) |
|
(until C++17)
(C++11)
|
범위 내 요소들을 무작위로 재정렬함
(함수 템플릿) |