2011-07-13 108 views
3

我有一些输入可能暂时不可用,并有一个错误关联。算法找到可能返回没有的最佳匹配

我正在寻找一种算法,会找到最好的可用输入。我最好的尝试,到目前为止是使用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(); 
} 

这工作时,所有的输入都标记为不可用,除了罚款。在这种情况下,最好设置为inputs.begin(),然后我需要测试它是否可用。

我宁愿将最佳设置为inputs.end(),这已经在我的代码中得到了满足。

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

谢谢

+0

这种情况下,具有更高阶的函数(特别是[filter](http://en.wikipedia.org/wiki/Filter_%28higher-order_function%29))会很方便。但是,我无法在STL中找到类似的东西。类似[remove-if](http://www.cplusplus.com/reference/algorithm/remove_if/)可能会有用。 – abeln

+0

它看起来像我有你的工作代码,只需要检查一个额外的时间。这真的是一个问题吗? – btilly

+0

@btilly是的,我有一些工作。我想知道是否有一个算法已经做到了我想要的。 – DanS

回答

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()); 
} 
+0

谢谢。让functor构造函数明确是否被认为是好的做法? – DanS

+0

这是一个很好的做法,使单一的参数构造器明确地nuless你有很好的理由不,但在这个例子中并不重要。 –

2

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

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

也许你可以使用std :: partition()将向量排序为可用和不可用的输入。然后使用min_element在可用子集内找到最佳值。