这一切都在标题中。
请考虑以下代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <typeinfo>
using namespace std;
int main(){
const int n=12;
double x[n];
x[0]=-0.717778;
x[1]=-0.496843;
x[2]=-0.429063;
x[3]=-0.3596;
x[4]=-0.205607;
x[5]=0.0730536;
x[6]=0.138018;
x[7]=0.585526;
x[8]=2.40104;
x[9]=3.752680001; //here
x[10]=3.75268;
x[11]=4.55704;
std::cout << std::is_sorted(x,x+n) << std::endl;
}
基本上,我希望它返回1(对于true):
虽然我可以看到x[9]
大于x[10]
,
它们之间的差异小于1e-8
所以我认为他们是平等的。
答案 0 :(得分:7)
我会用(C ++ 14):
std::adjacent_find(
std::begin(x),
std::end(x),
[epsilon](const auto& lhs, const auto& rhs) { return lhs > rhs + epsilon;})
== std::end(x);
因为is_sorted
会产生误导。
或在C ++ 11中:
std::adjacent_find(
std::begin(x),
std::end(x),
[epsilon](const double& lhs, const double& rhs) { return lhs > rhs + epsilon;})
== std::end(x);
答案 1 :(得分:1)
我不相信有一个标准的库算法会完全执行此操作,但std::is_sorted_until
会有所帮助。
bool sorted = true;
auto b = std::begin(x), e = std::end(x);
while (true)
{
b = std::is_sorted_until(b,e);
if (b == e)
break;
if (b[-1] - b[0] > epsilon)
{
sorted = false;
break;
}
}
虽然这可能只是让事情过于复杂。也许没有标准算法的直接循环会更简单。
bool sorted = true;
auto b = std::begin(x), e = std::end(x) - 1;
while (b < e)
{
if (b[0] - b[1] > epsilon)
{
sorted = false;
break;
}
++b;
}
是的,这更简单。