在C ++中拥有堆实现

时间:2013-05-30 12:03:41

标签: c++ algorithm heap

我必须在C ++中编写自己的堆实现,它存储类型为

的对象
std::pair<City, int>

其中City是一个存储两个整数的结构,表示城市坐标和字符串 - 城市名称。 我确实知道如何用普通整数做这个,但是使用一对值对我来说有点问题。 我已经开始编写我的堆类,但是,正如我所说,我不知道如何使用这些对。 我希望堆按对的int值排序。

3 个答案:

答案 0 :(得分:5)

如果您知道如何为int执行此操作,那么您几乎就在那里。与分配pair时对待int对象一样,但为了便于比较,请直接使用.second代替值。

答案 1 :(得分:1)

您可以尝试使用std::make_heap将您的一对序列放入堆顺序,请参阅此online example。要仅按int值排序,请使用C ++ 11 lambda表达式来比较每对的第二个元素

或者,假设您不能使用任何与STL堆相关的算法,但是给出了任何自制的

实现
template<typename RandomIt>
void my_make_heap(RandomIt first, RandomIt last)
{
     /* some algorithm using `a < b` to do comparisons */
}

您可以将其重写为(或添加重载)

template<typename RandomIt, typename Compare>
void my_make_heap(RandomIt first, RandomIt last, Compare, cmp)
{
     /* SAME algorithm, but now using `cmp(a, b)` to do comparisons */
}

然后将其称为my_make_heap(first, last, int_cmp),其中lambda表达式比较像这样的对:

    typedef std::pair<City, int> Element;
    auto int_cmp = [](Element const& lhs, Element const& rhs) {
         return lhs.second < rhs.second;
    };

答案 2 :(得分:1)

所以从我的理解:

您的结构是这样的,

struct node
{
   int X_coord;
   int y_coord;
   string name;
}

你需要根据对的“int”值形成堆,称之为'x'。

所以你的对是

pair<node n , int x> ;

This,是一个非常易读的Heap代码,在类中实现。

可以轻松修改为您对pair&lt;&gt;的要求价值。 只需使用“heap.second”作为您的关键值。