算法找到可能没有返回的最佳匹配

时间:2011-07-13 09:10:46

标签: c++ algorithm stl

我有一些输入可能暂时不可用且有错误相关。

struct sensorVal
{
    bool available;
    double error;
    double val;
    bool betterThan(const sensorVal* that) const;
}

我正在寻找能够找到最佳可用输入的算法。到目前为止,我最好的尝试是使用min_element,如下所示:

bool sensorVal::betterThan(const sensorVal& that) const
{
    if (available)
    {
        if (that.available)
            return (error < that.error);
        return true;
    }
    return false;
}

bool betterThan(const sensorVal& lhs, const sensorVal& rhs)
{
    return lhs.betterThan(rhs);
}

std::vector<sensorVal>::const_iterator 
find_best(const std::vector<sensorVal>& inputs)
{
    std::vector<sensorVal>::const_iterator best;

    best = min_element(inputs.begin(), inputs.end(), betterThan);

    if (best->available)
        return best;

    return inputs.end();
}

除非所有输入都标记为不可用,否则此工作正常。在这种情况下,best设置为inputs.begin(),然后我需要测试它是否可用。

我希望最好设置为inputs.end(),这已经在我的代码中得到满足。

是否存在可以找到最佳匹配的现有算法,可以返回没有合适的成员?或者一种改写我的测试的方法,以便将最佳设置为inputs.end()

感谢

3 个答案:

答案 0 :(得分:2)

也许你只是想让它看起来更好一点?

best = min_element(inputs.begin(), inputs.end(), betterThan);
return best->available ? best : inputs.end();

答案 1 :(得分:0)

您可以使用std::accumulate代替,但我认为您已有的解决方案更好。

struct best {
  std::vector<sensorVal>::const_iterator end;

  explicit best(std::vector<sensorVal>::const_iterator end) : end(end){}

  std::vector<sensorVal>::const_iterator operator()(std::vector<sensorVal>::const_iterator l, std::vector<sensorVal>::const_iterator r) {
    return (r->available() && (l == end() || r->error < l->error)) ? r : l
  }

};

std::vector<sensorVal>::const_iterator 
find_best(const std::vector<sensorVal>& inputs)
{
  return std::accumulate(inputs.begin(), inputs.end(), inputs.end(), best(inputs.end());
}

答案 2 :(得分:0)

也许您可以使用std :: partition()将矢量分类为可用和不可用的输入。然后使用min_element在可用子集中找到最佳值。