如何在“std::make_heap”中阅读“std::greater<>{}”

How to read "std::greater<>{}" in "std::make_heap"

提问人:Yves Schilli 提问时间:7/31/2022 最后编辑:Ian CookYves Schilli 更新时间:8/2/2022 访问量:145

问:

// 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 );”

谢谢你的帮助!

C++ 比较 stdvector

评论

0赞 WhozCraig 7/31/2022
该函数有多个重载。请参阅此处的 (2)。.
0赞 QuentinUK 7/31/2022
可选比较。默认值为 。<

答:

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_heapmax_heap

如果你想创建一个 ,你应该用它来比较元素,这正是它的作用。min_heapoperator>std::greater<>{}

评论

0赞 Yves Schilli 7/31/2022
谢谢!这是有道理的,而且有很大帮助!