「やらない」ソートを定義するにはどうすればよいですか?
-
22-09-2019 - |
質問
私は、特定の述語によってベクトルを並べ替える必要があるシステムに取り組んでいますが、クラスは制御できないはずです。基本的に、私は彼らに派生したクラスを渡し、彼らは盲目的にそれを並べ替えます。
「楽しい癖」の1つとして、ソートパターンの1つはエントリの順序です。これが私がこれまでに持っているものです。
struct Strategy
{
virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0;
};
struct strategyA : public Strategy
{
bool operator()(const Loan& lhs, const Loan& rhs) const
{
return true;
}
};
struct strategyB : public Strategy
{
bool operator()(const Loan& lhs, const Loan& rhs) const
{
return lhs.getID() > rhs.getID();
}
};
struct strategyC : public Strategy
{
bool operator()(const Loan& lhs, const Loan& rhs) const
{
return lhs.getFee() > rhs.getFee();
}
};
明らかに、StrategyAは反射的であるため、使用できません。偽りに設定すると、すべてを平等に扱い、データに別れを告げることができます。
これが私の質問です。何も変えないベクトルをソートするための述語関数を定義する方法はありますか?
おそらく最も簡単なソリューションは、エントリ変数をローンクラスに追加するか、ペアの1つとパートナーにすることです。あるいは、ソルターに使用するかどうかを伝える述語でパラメーターをフィードすることもできます。
解決
個人的には、あなたの戦略クラスには「ソート」方法が必要だと思います。そうすれば、適切と思われるため、std :: sort or surtを呼び出すことができます。 どうにか ソート戦略の一部と同様に。
Darios Stable_Sortの回答は、使用できれば非常に優れています。
ベクトル内のアイテムの位置に基づいてソートを行うことは可能ですが、アイテムが移動しないという意味ではありません(多くの種類のアルゴリズムは基本的にスクランブルします。あなたが始めたときのアイテムはどこでしたか。
比較が元のポジションへの現在のポジションのマッピングを維持することは可能ですが、多くの作業があります。理想的には、ロジックは比較だけでなく、ソートアルゴリズムに組み込む必要があります。これは、本質的に安定した_Sortの仕組みです。
別の問題 - コンテナに応じて - (たとえば)アイテムアドレスの順序は、常にアイテムの順序ではありません。
他のヒント
何も変えないベクトルをソートするための述語関数を定義する方法はありますか?
アルゴリズムに依存します。あなたのソートがaの場合 安定したソート, 、「等しい」要素の順序は変更されません(これは不安定な種類の場合は未定義です)。
使用を検討してください std::stable_sort
.
それがあなたが話している単なるベクトルである場合、おそらくあなたはあなたがソートすべきかどうかを決定するインターフェイスを提供することで逃げることができます。ベクトルは順序付けられた容器ではないため、それらを明示的にソートする必要があります。まったく並べ替えないでください。
アイテムの値のみに基づいてアイテムの順序を維持するソート機能はありません。あなたはあなたにもっと情報を提供する必要があります Strategy
, 、可能であれば。
別のアプローチは、データのセマンティクスをコンテナに持ち込むことです。同じデータのさまざまなアクセスと注文の方法で、Boost :: Multi_indexを使用することを検討してください。
http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html