提问人:Yves Schilli 提问时间:7/31/2022 最后编辑:Ian CookYves Schilli 更新时间:8/2/2022 访问量:145
如何在“std::make_heap”中阅读“std::greater<>{}”
How to read "std::greater<>{}" in "std::make_heap"
问:
// min heap solution
// extract k smallest data from a min-heap of all n data points
class K_Smallest_MinHeap {
public:
K_Smallest_MinHeap(std::size_t n, std::size_t k): N(n), K(k), count(0)
{ }
void add(int value){
values.push_back(value);
}
std::vector<int> get(){
std::make_heap(values.begin(), values.end(), std::greater<>{});
std::vector<int> result;
for (std::size_t i = 0; i < K; ++i){
std::pop_heap(values.begin(), values.end(), std::greater<>{});
result.push_back(values.back());
values.pop_back();
}
return result;
}
private:
std::size_t N;
std::size_t K;
std::size_t count;
std::vector<int> values;
};
嗨,大家好
我不明白 std::make_heap() 中的“std::greater<>{}”
我以为只需要两个迭代器开始和结束?
“void make_heap( RandomIt first, RandomIt last );”
谢谢你的帮助!
答:
0赞
Vlad from Moscow
7/31/2022
#1
该函数为两组参数重载std::make_heap
template<class RandomAccessIterator>
void make_heap(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void make_heap(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
因此,第三个参数显式指定了用于构建堆的比较函数。
评论
0赞
Yves Schilli
7/31/2022
谢谢。这样我就可以指定它是最小堆还是最大堆?
0赞
Vlad from Moscow
7/31/2022
@YvesSchilli 你是对的。比较函数可以是任何复杂程度。例如,您可以这样定义它,即所有偶数都小于(或大于)所有奇数。
0赞
ramsay
7/31/2022
#2
根据 cppreference:
template< class RandomIt >
void make_heap( RandomIt first, RandomIt last );
template< class RandomIt >
constexpr void make_heap( RandomIt first, RandomIt last );
template< class RandomIt, class Compare >
void make_heap( RandomIt first, RandomIt last,
Compare comp );
template< class RandomIt, class Compare >
constexpr void make_heap( RandomIt first, RandomIt last,
Compare comp );
构造 范围内的 a 。该函数的第一个版本用于比较元素,第二个版本使用给定的比较函数 comp。max heap
[first, last)
operator<
我不明白 std::make_heap() 中的“std::greater<>{}”
我以为只需要两个迭代器开始和结束?
如果你的函数只接受两个迭代器,它将创建一个 .make_heap
max_heap
如果你想创建一个 ,你应该用它来比较元素,这正是它的作用。min_heap
operator>
std::greater<>{}
评论
0赞
Yves Schilli
7/31/2022
谢谢!这是有道理的,而且有很大帮助!
评论
<