我必须在C ++中编写自己的堆实现,它存储类型为
的对象std::pair<City, int>
其中City是一个存储两个整数的结构,表示城市坐标和字符串 - 城市名称。 我确实知道如何用普通整数做这个,但是使用一对值对我来说有点问题。 我已经开始编写我的堆类,但是,正如我所说,我不知道如何使用这些对。 我希望堆按对的int值排序。
答案 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”作为您的关键值。