跳到主要内容

std::ranges::is_sorted_until() 算法

// (1)
constexpr I
is_sorted_until( I first, S last, Comp comp = {}, Proj proj = {} );

// (2)
constexpr ranges::borrowed_iterator_t<R>
is_sorted_until( R&& r, Comp comp = {}, Proj proj = {} );

参数类型是泛型的,并具有以下约束

  • I - std::forward_iterator
  • S - std::sentinel_for<I>
  • R - std::ranges::forward_range
  • Comp:
    • (1) - std::indirect_strict_weak_order<std::projected<I, Proj>>
    • (2) - std::indirect_strict_weak_order<std::projected<ranges::iterator_t<R>, Proj>>
  • Proj - (无)

所有重载的 ProjComp 模板参数具有以下默认类型:std::identity, ranges::less

检查范围 [first; last),并找到从 first 开始的最大范围,其中元素以非降序排列。

如果对于指向序列的任何迭代器 it 和任何非负整数 n(使得 it + n 是指向序列元素的有效迭代器),std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) 评估为 false,则序列相对于比较器 comp 是排序的。

  • (1) 使用给定的二元比较函数 comp 比较元素。
  • (2) 与 (1) 相同,但使用 r 作为源范围,如同使用 ranges::begin(r) 作为 first 和 ranges::end(r) 作为 last。

本页描述的函数类实体是niebloids

参数

first
last

要查找已排序上界的元素范围。

r

要检查的元素范围。

comp

应用于投影元素的比较函数。

proj

要应用于元素的投影。

返回值

first 开始的最大范围的上界,其中元素以非降序排列。

即,使范围 [first; it) 排序的最后一个迭代器 it

对于空范围长度为一的范围,返回等于 last 的迭代器。

复杂度

firstlast 之间的距离成线性关系。

异常

(无)

可能的实现

is_sorted_until(1) 和 is_sorted_until(2)

struct is_sorted_until_fn
{
template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less>
constexpr I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
{
if (first == last)
return first;

for (auto next = first; ++next != last; first = next)
if (std::invoke(comp, std::invoke(proj, *next), std::invoke(proj, *first)))
return next;

return first;
}

template<ranges::forward_range R, class Proj = std::identity,
std::indirect_strict_weak_order<
std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less>
constexpr ranges::borrowed_iterator_t<R>
operator()(R&& r, Comp comp = {}, Proj proj = {}) const
{
return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj));
}
};

inline constexpr is_sorted_until_fn is_sorted_until;

示例

Main.cpp
#include <array>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>

int main()
{
std::random_device rd;
std::mt19937 g {rd()};
std::array nums {3, 1, 4, 1, 5, 9};

constexpr int min_sorted_size = 4;
int sorted_size = 0;
do
{
std::ranges::shuffle(nums, g);
const auto sorted_end = std::ranges::is_sorted_until(nums);
sorted_size = std::ranges::distance(nums.begin(), sorted_end);

std::ranges::copy(nums, std::ostream_iterator<int>(std::cout, " "));
std::cout << " : " << sorted_size << " leading sorted element(s)\n";
}
while (sorted_size < min_sorted_size);
}
可能的输出
4 1 9 5 1 3  : 1 leading sorted element(s)
4 5 9 3 1 1 : 3 leading sorted element(s)
9 3 1 4 5 1 : 1 leading sorted element(s)
1 3 5 4 1 9 : 3 leading sorted element(s)
5 9 1 1 3 4 : 2 leading sorted element(s)
4 9 1 5 1 3 : 2 leading sorted element(s)
1 1 4 9 5 3 : 4 leading sorted element(s)
本文来源于此 CppReference 页面。它可能为了改进或编辑者偏好而进行了修改。点击“编辑此页面”查看本文档所做的所有更改。
悬停查看原始许可证。

std::ranges::is_sorted_until() 算法

// (1)
constexpr I
is_sorted_until( I first, S last, Comp comp = {}, Proj proj = {} );

// (2)
constexpr ranges::borrowed_iterator_t<R>
is_sorted_until( R&& r, Comp comp = {}, Proj proj = {} );

参数类型是泛型的,并具有以下约束

  • I - std::forward_iterator
  • S - std::sentinel_for<I>
  • R - std::ranges::forward_range
  • Comp:
    • (1) - std::indirect_strict_weak_order<std::projected<I, Proj>>
    • (2) - std::indirect_strict_weak_order<std::projected<ranges::iterator_t<R>, Proj>>
  • Proj - (无)

所有重载的 ProjComp 模板参数具有以下默认类型:std::identity, ranges::less

检查范围 [first; last),并找到从 first 开始的最大范围,其中元素以非降序排列。

如果对于指向序列的任何迭代器 it 和任何非负整数 n(使得 it + n 是指向序列元素的有效迭代器),std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) 评估为 false,则序列相对于比较器 comp 是排序的。

  • (1) 使用给定的二元比较函数 comp 比较元素。
  • (2) 与 (1) 相同,但使用 r 作为源范围,如同使用 ranges::begin(r) 作为 first 和 ranges::end(r) 作为 last。

本页描述的函数类实体是niebloids

参数

first
last

要查找已排序上界的元素范围。

r

要检查的元素范围。

comp

应用于投影元素的比较函数。

proj

要应用于元素的投影。

返回值

first 开始的最大范围的上界,其中元素以非降序排列。

即,使范围 [first; it) 排序的最后一个迭代器 it

对于空范围长度为一的范围,返回等于 last 的迭代器。

复杂度

firstlast 之间的距离成线性关系。

异常

(无)

可能的实现

is_sorted_until(1) 和 is_sorted_until(2)

struct is_sorted_until_fn
{
template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less>
constexpr I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
{
if (first == last)
return first;

for (auto next = first; ++next != last; first = next)
if (std::invoke(comp, std::invoke(proj, *next), std::invoke(proj, *first)))
return next;

return first;
}

template<ranges::forward_range R, class Proj = std::identity,
std::indirect_strict_weak_order<
std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less>
constexpr ranges::borrowed_iterator_t<R>
operator()(R&& r, Comp comp = {}, Proj proj = {}) const
{
return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj));
}
};

inline constexpr is_sorted_until_fn is_sorted_until;

示例

Main.cpp
#include <array>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>

int main()
{
std::random_device rd;
std::mt19937 g {rd()};
std::array nums {3, 1, 4, 1, 5, 9};

constexpr int min_sorted_size = 4;
int sorted_size = 0;
do
{
std::ranges::shuffle(nums, g);
const auto sorted_end = std::ranges::is_sorted_until(nums);
sorted_size = std::ranges::distance(nums.begin(), sorted_end);

std::ranges::copy(nums, std::ostream_iterator<int>(std::cout, " "));
std::cout << " : " << sorted_size << " leading sorted element(s)\n";
}
while (sorted_size < min_sorted_size);
}
可能的输出
4 1 9 5 1 3  : 1 leading sorted element(s)
4 5 9 3 1 1 : 3 leading sorted element(s)
9 3 1 4 5 1 : 1 leading sorted element(s)
1 3 5 4 1 9 : 3 leading sorted element(s)
5 9 1 1 3 4 : 2 leading sorted element(s)
4 9 1 5 1 3 : 2 leading sorted element(s)
1 1 4 9 5 3 : 4 leading sorted element(s)
本文来源于此 CppReference 页面。它可能为了改进或编辑者偏好而进行了修改。点击“编辑此页面”查看本文档所做的所有更改。
悬停查看原始许可证。