如何根据某种数据结构自定义std::make_heap比较函数?
How to customize std::make_heap comparison function based on some data structure?
我正在尝试使用 std::make_heap,它具有我需要的大部分属性。
我有一个整数向量,它只是我的数据结构的索引,我希望堆建立在该数据结构的某些 属性 之上。
如果我想要一个用于比较的 lambda 函数,那就很简单了:
[](int x, int y){return elementList[x]->lnc > elementList[y]->lnc;}
我面临的问题是比较函数只接受 2 个输入,我无法将 elementList
传递给它。
我有两个解决方案。首先,将指针存储在我拥有的向量中。其次是自己从头开始实现堆。
有更简单的解决方案吗?
更新:lambda 函数中的捕获子句(Brian 提到)是个好方法。如果我不想使用lambda函数,有什么解决办法吗?
std::make_heap
接受三个参数:两个表示随机访问范围的迭代器和一个比较函数。只需提供您的自定义比较函数是第三个参数。
#include <algorithm>
#include <vector>
// ...
std::vector<Foo> v{/* ... */};
std::make_heap(v.begin(), v.end(), [&elementList](auto lhs, auto rhs){
return elementList[lhs]->lnc > elementList[rhs]->lnc;
});
我正在尝试使用 std::make_heap,它具有我需要的大部分属性。 我有一个整数向量,它只是我的数据结构的索引,我希望堆建立在该数据结构的某些 属性 之上。 如果我想要一个用于比较的 lambda 函数,那就很简单了:
[](int x, int y){return elementList[x]->lnc > elementList[y]->lnc;}
我面临的问题是比较函数只接受 2 个输入,我无法将 elementList
传递给它。
我有两个解决方案。首先,将指针存储在我拥有的向量中。其次是自己从头开始实现堆。
有更简单的解决方案吗?
更新:lambda 函数中的捕获子句(Brian 提到)是个好方法。如果我不想使用lambda函数,有什么解决办法吗?
std::make_heap
接受三个参数:两个表示随机访问范围的迭代器和一个比较函数。只需提供您的自定义比较函数是第三个参数。
#include <algorithm>
#include <vector>
// ...
std::vector<Foo> v{/* ... */};
std::make_heap(v.begin(), v.end(), [&elementList](auto lhs, auto rhs){
return elementList[lhs]->lnc > elementList[rhs]->lnc;
});