web-dev-qa-db-ja.com

C ++の最小ヒープのコンパレータ

私は最小ヒープを作ろうとしています1 STL _make_heap_などを使用したC++でのlongsなどですが、コンパレータが正しく比較されていないようです。以下は私の現在のコンパレータです:

_struct greater1{
    bool operator()(const long& a,const long& b) const{
        return a>b;
    }
};
_

ただし、std::pop_heap(humble.begin(),humble.end(),g);を実行すると、gは_greater1_のインスタンスであり、humbleは_[9,15,15,25]_の場合に_sort_heap_を作成するヒープです__が呼び出され、_15_がポップされます。

私のコンパレータは正しいですか?何がうまくいかないのでしょうか?

編集:
sort_heapをコンパレータなしで実行しているのに気づきましたが、このコンパレータを実行すると、_[15,15,9,25]_から_sort_heap_を取得します。今、私のコンパレータは間違いなく機能していないと思いますが、理由はわかりません。

1STLはデフォルトで最大ヒープを作成するため、コンパレータが必要です。

22
Jakob Weisblat

おそらく、どこかに足りないものがあるかもしれませんが、以下のコードは意図したとおりに機能します:

#include <vector>
#include <algorithm>
#include <iostream>

struct greater1{
  bool operator()(const long& a,const long& b) const{
    return a>b;
  }
};

int main() {
  std::vector<long> humble;
  humble.Push_back(15);
  humble.Push_back(15);
  humble.Push_back(9);
  humble.Push_back(25);

  std::make_heap(humble.begin(), humble.end(), greater1());
  while (humble.size()) {
    std::pop_heap(humble.begin(),humble.end(),greater1());
    long min = humble.back();
    humble.pop_back();  
    std::cout << min << std::endl;
  }

  return 0;
}
18
perreal

greater<int>()を使用するだけです。 stdで事前定義されています。

11
zyfo2

sort_heapではなく、ベクターに対してmake_heapを再度呼び出します。 make_heapは、大なりコンパレータを指定すると、ベクトル全体を最小ヒープに再配置しますが、sort_heapは、要素を昇順で並べ替え、ヒープではなくなります。

#include <algorithm>
#include <iostream>
#include <vector>

struct greater1{
    bool operator()(const long& a,const long& b) const{
        return a>b;
    }
};

int main()
{
  unsigned int myints[] = {10,20,30,5,15};
  vector<unsigned int> v(myints, myints+5);

  //creates max heap
  std::make_heap(v.begin(). v.end()); // 30 20 10 5 15

  //converts to min heap
  std::make_heap(v.begin(). v.end(), greater1()); // 5 15 10 20 30

  unsigned int s =  v.size();

  //ALSO NEED TO PASS greater1() to pop()!!!
  for(unsigned int i = 0; i < s; i++)
    std::pop_heap(v.begin(). v.end(), greater1()); // popping order: 5 10 15 20 30

  return 0;
}
1
Dobob