2017-01-07 9 views
0

クラスファンクタ(ラムダとして実装するには複雑すぎる)がありますが、アイデアを削除するために、ファンクタがCompare述語を満たしていることを確認します。問題は、(1)より大きいすべての値を昇順に並べ替え、すべての値を '末尾'に配置することです(例:「大きい」値として扱う)。C++ソート「調整済み」比較ファンクタ

例えば、{2, 2, 2, 3, 3, 3, 4, 5, 6, 6, ..., 1, 1, 1}

関数オブジェクトは、それを用いて構成されている参照(複雑な)オブジェクトからの引数を抽出する構造体として実装されているが、重要な部分は、関数オブジェクトのメソッドです。簡単にするために:これはstd::sortstd::stable_sortで期待どおりに動作するように見える

bool operator() (unsigned i, unsigned j) 
{ 
    if (i == 1) return false; // (1 >= x) 
    if (j == 1) return true; // (x <= 1) 

    return (i < j); 
} 

。しかし、私はまだそれが厳密な弱い順序の点でCompareの基準を正しく満たすと確信していません。すべての場合にx <= 1 - つまり、i, j >= 1です。明らかに、(1, 1) => false

(1)の値を最後に置いても、私の '調整された'ファンクタは正しいですか?つまり、(1)は、x > 1より大きい値として解釈されるように処理されましたか?それとも、私のsortの実装で私はラッキーでしたか?私は明らかにしなければならないとして


、値(0)は発生しません。私はもともと(非常に巧妙な)受け入れられた答えに対するコメントでこれを持っていましたが、誤ってそれを削除しました。

+0

書かれているように見えます。あなた自身を説得するために、「無限」として「1」を読んでください。 –

+0

@IgorTandetnik - それは比較の前に 'i = 1'と' j = 1'のケースを明示的に排除するので、非常に有用なアドバイスです。それは私が100%確信していない 'Compare'述語の正式な定義です。 –

+0

さて、[ここに要件があります](http://en.cppreference.com/w/cpp/concept/Compare)。私はあなたの述語がそれらを満たしていることを自分に納得させる助けとなるかどうかはわかりません。 –

答えて

1

比較が完全/弱い順序である全単射操作を定義できる場合は、問題ありません。 また、あなたがゼロに何をしたいか依存する、あなたのタイプ(unsigned)のために、これは単に-=2/+=2

bool operator()(unsigned i, unsigned j) const{ 
    return (i-2) < (j-2); // usigned will wrap around 0 
} 

まあであることを私たちになります。

これは1 - 2 == std::numeric_limits<unsigned>::max()に依存しています。 をxとすると、xであってもfalseであるstd::numeric_limits<unsigned>::max() < x - 2が得られます(その場合は0の場合も同様です)。

+1

これは触発されています。希望通り、 'x = 1'でも条件が' false'と評価されると思います。 –

+0

注:これは '1'の前に' 0'を置きます(元の投稿は '0'がどこに行くか指定しません) –

+1

@ M.M。はい、OPはコメントに "ゼロがない"と言った。彼は後でコメントを削除した。だからこそ私は「あなたがゼロでしたいことにも依存している」と書いています。 – alfC

関連する問題