C++ 如何在C++;17

C++ 如何在C++;17,c++,math,functional-programming,c++17,C++,Math,Functional Programming,C++17,向量v1和v2正确通过测试,但v3没有通过测试,因为less函数默认为左关联,即它仅应用于左侧的元素 要正确测试v3,应将less函数作为一个整体应用于向量,并通过所谓的链接关联性实现 请注意,我不仅仅是试图检查排序序列。我正在寻找一种方法来为任何函数实现这种所谓的链接关联性,为了举例,这里是less 因此,我希望以简洁的方式将less应用为链式关联,即在不弄乱代码的情况下。我该怎么做 谢谢。我意识到我的第一个建议是使用std::is_sorted()在两个相邻元素具有相同值的情况下不起作用-它

向量
v1
v2
正确通过测试,但
v3
没有通过测试,因为
less
函数默认为左关联,即它仅应用于左侧的元素

要正确测试
v3
,应将
less
函数作为一个整体应用于向量,并通过所谓的链接关联性实现

请注意,我不仅仅是试图检查排序序列。我正在寻找一种方法来为任何函数实现这种所谓的链接关联性,为了举例,这里是
less

因此,我希望以简洁的方式将
less
应用为链式关联,即在不弄乱代码的情况下。我该怎么做


谢谢。

我意识到我的第一个建议是使用
std::is_sorted()
在两个相邻元素具有相同值的情况下不起作用-它们是排序的,但不是递增的。但是,如果您想使用标准算法,而不是手工编写的循环,
std::nextant_find()
可以:

1,2,3, Increasing? 1
3,2,1, Increasing? 0
3,2,1,2, Increasing? 0

为什么不使用
std::is_sorted()
?From:“
reduce
的行为类似于
std::acculate
,但范围的元素可以按任意顺序分组和重新排列”。因此您不能使用该函数。即使
std::acculate
也不会测试正确的东西,它将返回
((v[0]
@Shawn谢谢您的评论。我仍然想将链式关联性应用于
less
基本原理是因为我想对序列应用任何函数,而不是排序。@Jarod42,基本上,我正在寻找一种方法来应用
链关联性
,无论是使用
减少
还是
累积
只要简洁,任何方法都可以。感谢您的努力。使用

1,2,3, Increasing? 1
3,2,1, Increasing? 0
3,2,1,2, Increasing? 0
#include <algorithm>
#include <iostream>
#include <vector>

// Version using an explicit binary predicate
template <class It, class F>
bool increasing(const It beg, const It end, F op) {
  return std::adjacent_find(beg, end, [&op](const auto &a, const auto &b) {
           return !op(a, b);
         }) == end;
}

// Version using <
template <class It> bool increasing(const It beg, const It end) {
  return std::adjacent_find(beg, end, [](const auto &a, const auto &b) {
           return !(a < b);
         }) == end;
}

int main() {
  std::vector<int> v1{1, 2, 3}, v2{3, 2, 1}, v3{3, 2, 1, 2};

  std::cout << std::boolalpha;
  std::cout << "v1 increasing: " << increasing(v1.begin(), v1.end()) << '\n';
  std::cout << "v2 increasing: "
            << increasing(v2.begin(), v2.end(), std::less<int>()) << '\n';
  std::cout << "v3 increasing: " << increasing(v3.begin(), v3.end()) << '\n';
  return 0;
}