MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
shuffle.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ALGORITHM_SHUFFLE_HPP__
2#define MSTL_CORE_ALGORITHM_SHUFFLE_HPP__
3
10
13
19
33template <typename Iterator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
34void shuffle(Iterator first, Iterator last) {
35 if (first == last) return;
36 random_lcd rand;
37 for (Iterator i = _MSTL next(first); i != last; ++i) {
38 auto distance = _MSTL distance(first, i);
39 Iterator j = _MSTL next(first, rand.next_int(0, static_cast<int>(distance)));
40 _MSTL iter_swap(i, j);
41 }
42}
43
62template <typename Iterator, typename Generator, enable_if_t<is_ranges_rnd_iter_v<Iterator>, int> = 0>
63void shuffle(Iterator first, Iterator last, Generator& rand) {
64 if (first == last) return;
65 for (Iterator i = _MSTL next(first); i != last; ++i) {
66 Iterator j = _MSTL next(first, rand(i - first + 1));
67 _MSTL iter_swap(i, j);
68 }
69}
70 // ShuffleAlgorithms
72
74#endif // MSTL_CORE_ALGORITHM_SHUFFLE_HPP__
线性同余随机数生成器
int next_int(const int max)
生成[0, max)范围内的随机整数
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_MSTL swap(*a, *b)))
交换迭代器指向的元素
void shuffle(Iterator first, Iterator last)
随机重排序列
MSTL随机数生成器