用于排序的多态STL比较函数(类cmp类,类cmp int)

时间:2010-09-30 23:07:01

标签: c++ templates stl polymorphism compare

我正在实施游戏。我有一个状态树和一组<>基于优先级的队列,根据成本对状态进行排序。为此,我有<运营商实施为:

struct DereferenceCompareState : 
public std::binary_function<State*, State*, bool>
{

  bool operator()(const State* lhs, const State* rhs) const
  {
    verbose6("comparing " << lhs->getCost() << " with " << rhs->getCost());
    return lhs->getCost() < rhs->getCost();
  }

};

现在,我想要消除成本高于某些数字的状态,但为此,我必须创建一个具有我想要的成本的虚拟状态,并在集合上执行upper_bound。有没有办法定义一个运行状态与整数比较的运算符,例如添加到上面的结构?感谢

2 个答案:

答案 0 :(得分:1)

您可以通过重载struct DereferenceCompareState来轻松地向operator()添加更灵活的比较功能,但这对您尝试的内容没有帮助。您遇到的真正问题是std::set<T,Cmp>::upper_bound()仅将键/值类型(T)作为参数。所以无论你对你的比较类型做什么,你都无法调用s.upper_bound(5);最好的办法就是使用你所描述的临时State对象。

答案 1 :(得分:1)

问题是set根据定义是一个关联容器,其中元素本身就是键。但是,您似乎想要的是一个容器,其中键是从元素派生的表达式,而不是元素本身。

因此,如果您只查看州的费用,那么将其设为map<int, State*>,费用是关键。如果你想在成本(以及可能的其他属性)上对状态本身进行查找,那么我建议你使用Boost MultiIndex,它允许你拥有多个索引(包括身份,喜欢set)在一个容器上。如果您在getCost()上使用有序索引,那么您还可以获得该索引的upper_bound(),这将完全符合您的要求。