使用std :: is_sorted测试数组,但具有预设精度

时间:2014-09-02 12:03:17

标签: c++ std

这一切都在标题中。

请考虑以下代码:

#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 所以我认为他们是平等的。

2 个答案:

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

是的,这更简单。