make_heap使用函数对象

时间:2012-04-16 00:52:03

标签: c++ stl graph heap

我需要为make_heap重载哪些运算符?是()运算符吗?如果我已经在我的算法中为另一个案例定义了那个。任何人都可以提供在我的情况下使用make_heap的正确方法。请参阅下面的代码以便更好地理解。

在顶点类中我有

bool operator() (vertex &v) const 
{ 
  return (v.key() == _key); 
}

在以下std方法find_if

中构建图形时使用
vertex_iterator GraphComponents::graph::find_vertex_by_key(int key)
{
  return std::find_if(_vertices.begin(), _vertices.end(), GraphComponents::vertex(key));
}

现在在我的算法中,我想在不同的上下文中使用顶点作为Function对象。

std::list<int> GraphComponents::graph::breadth_first_search (int key, int start_key)
{
  std::vector<GraphComponents::vertex *> heap;
  for (vertex_iterator copy_iter = _vertices.begin(); copy_iter != _vertices.end(); ++copy_iter) {
    heap.push_back(&(*copy_iter));
  }
  std::make_heap(heap.begin(), heap.end(), vertex(<should be distance>));
}

这里我不想在比较中使用键,但我想使用距离成员,因此具有最短距离的顶点位于堆的顶部。除了实现我自己的堆之外,建议的方法是什么?

1 个答案:

答案 0 :(得分:3)

实现一个函数,它接受你的类型的两个参数,如果左手参数应该被认为相对小于右手参数,则返回true。 (少可以意味着更大)

然后将该函数作为第三个参数传递给make_heap。或者你可以使用上面描述的语义来实现operator<,如果你没有传递任何函数,它将被使用。

http://en.wikipedia.org/wiki/Strict_weak_ordering

在您的情况下,您的元素是指针,因此您不能编写operator<,因为已经为所有指针类型定义了该函数。所以你必须编写一个单独的函数,如下所示:

bool CompareByDistance(const GraphComponents::vertex * lhs,
                       const GraphComponents::vertex * rhs)
{
    return lhs->distance() < rhs->distance();
}