【问题标题】:Polymorphic STL compare function (class cmp class, class cmp int) for sorting用于排序的多态 STL 比较函数(class cmp class,class cmp int)
【发布时间】:2010-09-30 23:07:01
【问题描述】:

我正在实现一个游戏。我有一个状态树和一个基于 set 的优先级队列,可以根据成本对状态进行排序。为此,我将

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。有没有办法通过例如添加到上面的结构来定义一个适用于状态与整数比较的运算符?谢谢

【问题讨论】:

  • 我最终定义了一个 CostProvider 基类,它也可以用整数构造。将集合类型更改为 CostProvider。所以这很快,但我不知道有多好。谢谢!

标签: c++ templates stl polymorphism compare


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    因此,如果您只查找您所在州的成本,则将其设为map&lt;int, State*&gt;,其中成本是关键。如果您想查找状态本身的成本(可能还有其他属性),那么我建议您使用Boost MultiIndex,它可以让您拥有多个索引(包括身份,如 set ) 在一个容器上。如果您在 getCost() 上使用有序索引,您还将获得该索引的 upper_bound(),这将完全符合您的要求。

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多