5

私は、特定の述語でベクトルをソートできるようにする必要があるシステムに取り組んでいますが、クラスで制御することはできません。基本的に、私はそれらに派生クラスを渡し、彼らは盲目的にそれをソートします。

「楽しい癖」の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は反射的であるため、使用できません。falseに設定すると、すべてが同等に扱われ、データに別れを告げることができます。

これが私の質問です。何も変更しないベクトルをソートするための述語関数を定義する方法はありますか?

おそらく最も簡単な解決策は、エントリ変数の順序をLoanクラスに追加するか、ペアの1つと組み合わせる方法であることを認識しています。あるいは、ソーターにそれを使用するかどうかを指示する述語を使用してパラメーターをフィードすることもできます。

4

5 に答える 5

7

何も変更しないベクトルをソートするための述語関数を定義する方法はありますか?

アルゴリズムによって異なります。ソートが安定ソートの場合、「等しい」要素の順序は変更されません(これは不安定ソートでは定義されていません)。

の使用を検討してくださいstd::stable_sort

于 2010-02-23T16:43:59.587 に答える
2

Personally, I think your strategy class should have a "sort" method. That way, it can either call std::sort or not, as it sees fit. Whether as well as how becomes part of the sorting strategy.

Darios stable_sort answer is very good, if you can use it.

It is possible to do sorting based on item position in a vector, but it doesn't mean items won't move (many sort algorithms will basically scramble-then-resort your data), so you have to have some reliable way of determining where the items were when you started.

It's possible for the comparison to keep a mapping of current-position to original-position, but a lot of work. Ideally the logic needs to be built into the sort algorithm - not just the comparison - and that's essentially how stable_sort works.

Another problem - depending on the container - the order of (say) item addresses isn't always the order of the items.

于 2010-02-23T16:55:53.147 に答える
1

それが単にあなたが話しているベクトルである場合、おそらくあなたはあなたがソートするべきかどうかを決定するインターフェースを提供することで逃げることができます。ベクトルは順序付けられたコンテナではないため、明示的に並べ替える必要があります。それらをまったくソートしないでください。

于 2010-02-23T16:42:26.307 に答える
1

アイテムの値のみに基づいてアイテムの順序を保持するソート機能はありません。Strategy可能であれば、より多くの情報を提供する必要があります。

于 2010-02-23T16:46:39.103 に答える
0

別のアプローチは、データのセマンティクスをコンテナーに取り込むことです。同じデータへのアクセスと順序付けのさまざまな方法にboost::multi_indexを使用することを検討してください。

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

于 2010-02-23T16:47:50.770 に答える