私は理解しているように、ユーザー定義の構造体のために、それは簡単です。ちょうどオペレータ<をオーバーロードしてください。しかし、int/floatなどの場合、実際にはintのためにオペレータ<をオーバーロードする必要がありますか?ここ は、私が試したものです:簡単なヒープをstlで維持する簡単な方法は?
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool comp(const int& a, const int& b)
{
return a<b?false:true;
}
int main()
{
int myints[] = {10,20,30,5,15};
vector<int> v(myints,myints+5);
vector<int>::iterator it;
make_heap(v.begin(), v.end(), comp);
cout << "initial min heap : " << v.front() << endl;
for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
cout<<endl;
pop_heap (v.begin(),v.end());
v.pop_back();
for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
cout<<endl;
}
結果は以下のとおりです。
initial min heap : 5
5 10 30 20 15
30 10 15 20
今pop_heap、push_heapが正しく分ヒープを維持していないのだろうか?これを達成するための簡単な方法がありますか? ありがとう!
編集: 申し訳ありませんが、私はマニュアルを慎重にチェックしませんでした。はい、pop_heapまたはpush_heapにコンプを渡すとそのトリックが行われます。しかし、どういう意味ですか、私は外部コンパレータを使うべきではありませんか?それが正しい方法でない場合、これを達成するための一般的な方法は何ですか?
大きな問題は、コンパレータが厳密に弱い順序のコンパレータではないため、違法である 'int'の' operator> = 'に相当するということです。 – ildjarn
@ildjarn:ありがとう、修正されました。 –
申し訳ありませんが、私はマニュアルを注意深くチェックしませんでした。はい、pop_heapまたはpush_heapにコンプを渡すとそのトリックが行われます。しかし、どういう意味ですか、私は外部コンパレータを使うべきではありませんか?それが正しい方法でない場合、これを達成するための一般的な方法は何ですか? – user268451