2

ペアの最初の要素のみを並べ替える必要があるため、並べ替え演算子の使用に問題があります。コードは単純ですが、機能していません。

演算子は次のように定義されています。

struct sort_pred {
    bool operator()(const CromosomaIndex &left, const CromosomaIndex &right) { 
        return left.first < right.first;
    }
};

タイプは

typedef std::pair<double,int> CromosomaIndex;

私はこのように配列をソートしようとしています:

CromosomaIndex nuevo[2];
nuevo[0].first = 0.01;
nuevo[0].second = 0;
nuevo[1].first = 0.009;
nuevo[1].second = 1;
int elements = sizeof(nuevo) / sizeof(nuevo[0]);
sort(nuevo, nuevo+ elements, sort_pred());

しかし、問題は、これが最初と2番目の要素を並べ替えていることであり、最初の要素のみを並べ替えて2番目の要素を固定したいだけです。何かご意見は?

4

3 に答える 3

5

結果を元の順序に依存させる場合は、を使用しますstd::stable_sort

于 2012-08-26T02:35:04.460 に答える
2

このアプローチでは、ペアを1つのユニットとしてソートします。これは、期待されることです。ペアのfirstとを分割することは意味がありません。アイテムsecondのみを並べ替えてそのままにしておきたい場合は、別のペアのセットになります。firstsecond

firstとは別に並べ替える場合はsecond、それらを別々の配列に配置し(さらに良いのは、 vectorsを使用)、最初のベクトルを並べ替えます。次に、両方のベクトルを反復し、新しいペアのセットを作成します。

于 2012-08-26T02:36:46.707 に答える
1

他の質問の答えを理解したかどうかはわかりませんが、double値に応じてペア全体を並べ替えることができます。元のインデックス(int)は、元のベクトルのその場所にあったに添付してdouble、場所を復元できるようにする必要があります。double内のみを並べ替えた場合pair、の値はint配列内の場所になります...これはデータムとして維持する必要はまったくありません。

または、同様の(わずかに異なる)ソリューションを検討することもできます。doubleのベクトルのサイズで[0..N)ある範囲の値で初期化される整数の単一のベクトルを作成します。次に、渡された値()を調べる代わりに、元のベクトルの値をチェックNするコンパレータファンクタを使用して、インデックスのベクトルを並べ替えます。intdouble

struct dereference_cmp {
   std::vector<double> const & d_data;
   dereference_cmp( std::vector<double> const & data ) : d_data(data) {}
   bool operator()( int lhs, int rhs ) const {
      return d_data[lhs] < d_data[rhs];
   }
};
std::vector<double> d = ...;
std::vector<int> ints;
ints.reserve( d.size() );
for ( int i = 0; i < d.size(); ++i ) ints.push_back(i);
std::sort( d.begin(), d.end(), dereference_cmp(d) );

このアプローチでは、並べ替えられていないのはdoublesであり、インデックスのベクトルであることに注意してください。完了後、sortインデックスのベクトルには、 =>のdoubleようなのベクトルへの位置が含まれます。i < jd[ ints[i] ] <= d[ ints[j] ]

プロセス全体で、並べ替えるのはインデックスであり(元のアプローチでは、並べ替えられていないベクトルを再構築できるようになり、このアプローチでは、値を並べ替えられた順序で見つけることができるようになります)、元のベクトルがそこにあることに注意してください。ソートの基準を提供するためだけに。

また、値とインデックスの両方で変更されたコンテナではなく、インデックスのみを並べ替える唯一の理由は、データの移動コストが高い場合であることに注意してください(各データは、安価に移動できない大きなオブジェクトであると言います。データの(ベクトルではなく)配列を保持する構造体)。

于 2012-08-26T03:58:18.773 に答える