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;
}