1#ifndef NEFORCE_CORE_ALGORITHM_PARTITION_HPP__
2#define NEFORCE_CORE_ALGORITHM_PARTITION_HPP__
13NEFORCE_BEGIN_NAMESPACE__
45template <
typename Iterator,
typename Predicate>
46constexpr Iterator
partition(Iterator first, Iterator last, Predicate pred) {
48 static_assert(
is_invocable_v<Predicate,
decltype(*first)>,
"Predicate must be invocable");
82template <
typename Iterator,
typename Compare>
83constexpr Iterator median_iter(Iterator a, Iterator b, Iterator c, Compare comp) {
87 }
else if (comp(*a, *c)) {
95 }
else if (comp(*b, *c)) {
118template <
typename Iterator,
typename Compare>
122 if (last - first < 2) {
126 Iterator mid = first + (last - first) / 2;
127 Iterator piv_iter = inner::median_iter(first, mid, last - 1, comp);
131 Iterator i = first + 1;
135 if (comp(*i, pivot)) {
154template <
typename Iterator>
163NEFORCE_END_NAMESPACE__
constexpr bool is_invocable_v
is_invocable的便捷变量模板
constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
constexpr Iterator lomuto_partition(Iterator first, Iterator last, Compare comp)
Lomuto 分区算法(基准值归位)
constexpr Iterator partition(Iterator first, Iterator last, Predicate pred)
分区算法
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素