C ++でこれを行う正しい方法は、テンプレートを使用することです。
何かをソートすることはアルゴリズムであり、一般的に永続的な状態はほとんどまたはまったくありません。ソートはオブジェクトではなく、データ(オブジェクトの場合もあります)に対する関数です。
ライブラリには、次のstd
シグネチャを持つソートがすでにあります。
template<typename I, typename C = std::less<typename std::iterator_traits<I>::value_type> >
void sort(I begin, I end, C comp = C());
イテレータbegin
とend
は、ソートされる値の範囲を示します。compは、値の範囲の2つの要素が渡されると、最初の要素が2番目の要素よりも小さいかどうかを示すファンクター(または関数)です。
これをで使用するには、次のstd::vector
ようにします。
std::vector<int> myVector; // assume it has some data in it
sort( myVector.begin(), myVector.end() );
std :: sortは(通常は?)クイックソートです。しかし、インターフェースは、迅速なバブルおよび挿入ソートで機能します。
このアプローチの大きな利点は、ある種類が別の種類を使用できることです。例として、クイックソートは大きなデータセットでは高速ですが、多くの場合、小さなデータセットでは挿入ソートの単純さが優先されます(n ^ 2のオーバーヘッドがある場合でも定数係数が低くなります)。したがって、このようにソートを記述することにより、要素の数が少ない場合に、クイックソートの再帰呼び出しを代わりに挿入ソートにすることができます。
ここで、使用しているアルゴリズムの実行時置換が必要な場合は、使用しているイテレーター、さらにはどの比較子を特定する必要があります。これは、共通の関数シグネチャ(私が行うこと)、または純粋な仮想インターフェイスを備えた基本クラス(これはお勧めしません)のいずれかを使用して実行できます。ただし、実行時に選択されたコンパレータのオーバーヘッドは重要であることに注意してください。固定イテレータの選択、または関数へのポインタまたは仮想メソッド呼び出しからのオーバーヘッドは、アルゴリズムの再帰呼び出しで実行されない限り、妥当なサイズのコンテナではかなり安価になります。