クラスファンクタ(ラムダとして実装するには複雑すぎる)がありますが、アイデアを削除するために、ファンクタがCompare述語を満たしていることを確認します。問題は、(1)
より大きいすべての値を昇順に並べ替え、すべての値を '末尾'に配置することです(例:「大きい」値として扱う)。C++ソート「調整済み」比較ファンクタ
例えば、{2, 2, 2, 3, 3, 3, 4, 5, 6, 6, ..., 1, 1, 1}
関数オブジェクトは、それを用いて構成されている参照(複雑な)オブジェクトからの引数を抽出する構造体として実装されているが、重要な部分は、関数オブジェクトのメソッドです。簡単にするために:これはstd::sort
とstd::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)
は発生しません。私はもともと(非常に巧妙な)受け入れられた答えに対するコメントでこれを持っていましたが、誤ってそれを削除しました。
書かれているように見えます。あなた自身を説得するために、「無限」として「1」を読んでください。 –
@IgorTandetnik - それは比較の前に 'i = 1'と' j = 1'のケースを明示的に排除するので、非常に有用なアドバイスです。それは私が100%確信していない 'Compare'述語の正式な定義です。 –
さて、[ここに要件があります](http://en.cppreference.com/w/cpp/concept/Compare)。私はあなたの述語がそれらを満たしていることを自分に納得させる助けとなるかどうかはわかりません。 –