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");
101template <
typename Iterator,
typename T,
typename Compare>
102constexpr Iterator
lomuto_partition(Iterator first, Iterator last,
const T& pivot, Compare comp) {
104 static_assert(
is_invocable_v<Compare,
decltype(*first),
decltype(*first)>,
"Compare must be invocable");
106 while (first < last) {
107 while (comp(*first, pivot)) {
111 while (comp(pivot, *last)) {
114 if (!(first < last)) {
132template <
typename Iterator,
typename T>
141NEFORCE_END_NAMESPACE__
NEFORCE_INLINE17 constexpr bool is_invocable_v
is_invocable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
NEFORCE_INLINE17 constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr Iterator partition(Iterator first, Iterator last, Predicate pred)
分区算法
constexpr Iterator lomuto_partition(Iterator first, Iterator last, const T &pivot, Compare comp)
Lomuto分区算法
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素