C++標準ライブラリでは、コンパレータをstd::sort
に渡します。しかし、私はT
オブジェクトのリストを関数f
でソートしたいという私のコードに多くの場合があります。このようなコンパレータは有効なオプションです:std :: sort by unary mapping
bool compare(const T& a, const T& b) {
return f(a) < f(b);
}
これは最適ではありません。 f
は評価が遅くなりますが、同じT
オブジェクトを持つすべてのコールで同じ値が返されます。ですから、範囲内のすべてのオブジェクトに対してf
を1回計算し、それらの結果をソートすることです。
template <typename IterT, typename Transformation>
void sort(IterT left, IterT right, Transformation f) { /* ? */ }
ように、このコールの後、シーケンスleft
内のすべてのiter
ためf(*iter) <= f(*std::next(iter))
right
へ:
私の目標は、(私がすることができていない)、この関数を記述することです。
さらに、関数がこれらの要件を満たす必要があります。
- はタイプ
T
のいずれかの追加オブジェクトを割り当てません。 f
正確にはstd::distance(left, right)
と評価されます。- O(n log n)の全体的な複雑さを維持します。
- std :: sortに関して実装する必要があります。もちろん、私は自分のマージソートを実装することでこの問題を解決することができますが、それは避けたいものです。
(C++ 11が好ましく、C++ 14もOKです)
オブジェクト 'a'の中に' f(a) 'の結果を格納し、オブジェクトの状態が変化したときにのみ計算してみましょう。 –
"memoization"を使って 'f'の結果をキャッシュすることができます。 'unordered_map'を使用します。 'T '型のオブジェクトをマップキーとして使うことができない場合、複雑になります。' f'が使う 'T'のデータのサブセットがありますか?あるいは、実際のオブジェクトへのポインタ配列をソートできますか? –
'f(* iter)'は '* iter'または' iter'のみに依存していますか? –