2011-10-26 4 views
1

私は3つのパラメータを取るpush_heap関数は何をするのだろうか?C++のpush_heap関数は何をしますか?

#include <iostream> 
#include <cassert> 
#include <algorithm> 
#include <vector> 
using namespace std; 

class HeapCompare_f 
    { 
     public: 

      bool operator() (int x, int y) const 
      { 
       return x > y; 
      } 
    }; 
int main() 
{ 
    vector<int> vector1(5); 

    for (int i = 0; i < 5; ++i) 
     vector1[i] = 5-i; 

    for (int i = 0; i < 5; ++i) 
     cout << vector1[i]; 
    cout << endl; 

    push_heap(vector1.begin(), vector1.end(),HeapCompare_f()); 

    for (int i = 0; i < 5; ++i) 
     cout << vector1[i]; 
    cout << endl; 



    return 0; 
} 

このコードの出力は

54321 
15324 

また、私はどのように私はCにその機能を実装することができますだろうか?

+0

このコードは、 'push_heap'の前提条件に違反し、指定された範囲が最後の要素を除く有効なヒープであるため、正しくありません。 – interjay

+0

真剣に? http://en.cppreference.com/w/cpp/algorithm/push_heap –

答えて

4

この機能はありますかではなく、の値をヒープに変換します!

std::push_heap(first, last [, comp]) 

範囲[first,last-1)が既に有効heapで、有効なヒープ要件を維持するために正しい位置に移動する、ヒープに位置last-1に値をプッシュすることを前提としています。 <演算子を使用して、要素の順序付けまたはユーザー指定のコンパレータを決定します。

+0

'make_heap(vector1.begin()、vector1.end());' 'push_heap'関数の前にコードを挿入すると、出力は変化する。そして、あなたは 'push_heap'関数が' last-1'の値を正しい位置にプッシュすると言っています。正しい位置は何ですか?私たちの場合、 'last-1'の値は' 1'です。それはどこにあるべきですか?ベクトルの始めに?最後に?出力が '15324'で始まっている場合、他の要素の順序が変更されたのはなぜですか? 'last -1'の要素を開始時に移動するとき、出力は' 15432'でなければならない – Alptugay

+0

@Alptugay正しい位置は、ヒープ要件が保持する任意の位置です。これを理解していない場合は、最初にヒープデータ構造が何であるかを調べてください(多分上記のリンクが役立ちます)。 'push_heap'は、' first'と 'last-1'の間の範囲がすでにヒープである場合にのみ機能します。結果は未定義です。そして、はい、 'push_heap'は、アイテムを正しい位置に置くために要素の順序を変更することができます。もちろん、 'last-1'が既に正しい位置にあるので、' make_heap'と 'push_heap'を同じ範囲で呼び出すことで違いはありません。 –

6

push_heapが正しく使用されていません。あなたのベクトルを初期化した後、あなたはヒープの順にそれを置くために

が必要になります。

std::make_heap(vector1.begin(), vector1.end()); 

ヒープにさらなる要素を追加するには、その後、push_heap呼び出し、最初のベクトルの背面にそれぞれをプッシュする必要があります。

std::pop_heap(vector1.begin(), vector1.end()); 
vector1.pop_back(); 
012:

vector1.push_back(42); 
std::push_heap(vector1.begin(), vector1.end()); 

最後に、ヒープ内の最初の要素を削除するには、ベクターから最後の要素をポップに続いて、pop_heapを呼び出す必要があります

3つのパラメータのヒープ関数を使用すると、正しく実行しているヒープ順序を制御するための比較方法を指定できます。

手動push_backおよびpop_back呼び出しの理由は、ヒープ関数がイテレータをコンテナにしか見ず、コンテナ自体にアクセスできないためです。イテレータはコンテナの内容を変更するのに十分ではないので、コンテナ(あなた)の所有者が手動で行う必要があります。

これを自分で処理することを避けるには、std::priority_queueを使用することをおすすめします。

+0

ありがとうございました。あなたはそれを言った3つのパラメータのヒープ関数は、ヒープ順序を制御するための比較メソッドを指定することができますが、どのようにそれを行うのですか?私は実際に出力の順序を見ていない。 15324はかなり整列していないようです – Alptugay

+0

@Alptugay注文する必要はありませんが、ヒープの必要条件があります。そして、もう一度:もしあなたがこれが何を意味するのか分からなければ、ヒープデータ構造が何であるか調べましょう。 –

関連する問題