2016-11-27 5 views
6

関数オブジェクトのドキュメントは、それよりも大きくて小さくなっています。私はそれが何であるかを理解していますが、私はそれをまだ得ていません。私のコンテナを昇順または降順に並べ替えて使用するのでしょうか?次の2つの行が反対のことをしているように見えるので、私は特に混乱しています。C++の関数オブジェクトの数が増えたり少なくなったりする

std::priority_queue<int, std::vector<int>, std::greater<int> > q2; 

for(int n : {1,8,5,6,3,4,0,9,7,2}) 
    q2.push(n); 

print_queue(p2); 

この印刷0、1、2、3、4、5、6、7、8、9しかし、これは与える

int x[10] = { 1,3,5,7,9,2,4,6,8,10 }; 
std::sort(x,x+10,std::greater<int>()); 

印刷10、9、8、7、例えば、「より大きい」一般的にどのように働くかを言うのではなく、誰かが私の例でどのように「より大きい」働きをすることができればいいでしょう。

+0

[std :: lessとstd :: greaterをstd :: sortで使用することに関する混乱](http://stackoverflow.com/questions/14828476/confusion-about-using-stdless-and- stdgreater-with-stdsort) – MikeT

+0

@MikeT:それを通り過ぎてしまった、まだ混乱があった。しかし、ダイとストーリーテラーの答えから感謝する。 –

答えて

4

あなたは常にキューの最小要素をポップします。優先度キューは、与えられた順序関係とは逆の順序で並べ替えられます。

template< 
    class T, 
    class Container = std::vector<T>, 
    class Compare = std::less<typename Container::value_type> 
> class priority_queue; 

それは「最大」RHS要素を取得するためにless<>()(lhs, rhs)を適用します。

デフォルトのテンプレートの定義は次のようになります。しかし、あなたの場合は、greater<>()(lhs, rhs)を適用して "最大" rhs要素を取得します(これはもちろん最小です)。一方、あなたが指定した注文タイプは保存されます。

std::sortしたがって、std::lessは昇順にソートされ、std::greaterは降順にソートされます。

+0

デフォルトのテンプレート定義では、priority_queueはstd :: lessを使用します。したがって、デフォルトでは、より大きい外部ファンクタを使用せずに、昇順で印刷すべきですか?それはなぜデフォルトで下降するのですか?申し訳ありませんが、今は一部を手に入れているようです。しかし、なぜそれが "最大" rhs要素を得るのかまだ分かりません。 –

+0

@AshwinBaskaranの場合、テンプレートはファンクタのタイプをブラックボックスとして扱います。ブラックボックスはいくつかのルールに従って要素を注文します。規則によれば、常に「最大の」要素がありますが、整数の規則的な順序付けによれば「最大」である必要はありませんが、それはより明確になりますか? – StoryTeller

+0

はい、私は今それを理解することができます。より大きい/より小さいファンクタは、基本的にルールに従って数をソートします。デフォルトでは、priority_queueはstd :: lessを使用します。そして、私はここでは、ルールは "最大"の数字は、最小の整数値を持つものだと思う。だから、最初に現れるはずです。 priority_queueはデフォルトで昇順に従いますか?私はどこかで間違っていることを知っている、ちょうどどこを把握することはできません。 –

1

std::greater<int>は、整数のソート順を逆にします。

std::priority_queuedequeues the next largest element by defaultですので、std::greater<int>を使用すると、これを反転して、次に小さい要素をデキューします。

同様に、std::sortは、デフォルトで昇順で要素をソートしますが、std::greater<int>を使用すると降順ソート順が表示されます。

+0

これは理解しやすくなります。したがって、より大きなが、すべてのコンテナ/コンテナアダプタの自然な並べ替え順序を常に逆にすると考えるのは安全ですか? –

関連する問題