我有一些输入可能暂时不可用且有错误相关。
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()
。
感谢
答案 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在可用子集中找到最佳值。