2011-11-16 3 views
9

をソート私はこの2 vector<double>massvelocity同じサイズNの両方を持っています。それらは、N個の粒子の質量および速度に関する情報を含む。 mass[i]velocity[i]は、i番目の粒子の性質です。2つのベクトルを「ロック」と彼らに

これらの2つのベクトルを「ロック」して質量の大きい順に並べ替えることはC++で可能でしょうか? ソートの後、ベクトルmassは昇順でなければならず、速度ベクトルはソートされたマスの対応する速度を含むべきである。

ソート前に質量=(4,2,1,3)と速度=(13,14,15,16) 質量=(1,2,3,4)と速度=(15,14,16,13)私はこれを知っている)

1(非効率的)な方法は、構造体の

struct particle 
{ 

double mass; 
double velocity; 


bool operator < (const particle& str) const 

{ 
    return (mass < str.mass); 
    } 



}; 

のベクターにデータを転送し、vector<particle> particlelist(N)を作成し、<をオーバーロードすることにより、std::sortを使用して、このベクトルをソートすることです私が上記の定義で行ったように、演算子。

配列の構造のファクトリー(少なくともCUDAでは)と比較して非効率的であると聞いたので、私は自分のデータを構造体の配列に入れたくありません。

+0

は1つが、私同様、他の変更をプロパティを変更する場合は以下のように意味ですか優れた「ロック」を定義しますか? –

+0

私は編集を行い、質問を明確にしました。 – smilingbuddha

+0

関連:http://stackoverflow.com/questions/3398819/sort-by-proxy-or-sort-one-container-by-the-contents-of-another-in-c –

答えて

5

少なくとも私が知る限り、標準ライブラリに直接あなたのためにこれを行います。最も明白な可能性はおそらくBoost Zip Iteratorを使って2つの配列を単一のコレクションのように動作させることでしょう。

+2

[zip_iteratorはstd :: sortで動作しません](http://stackoverflow.com/a/9343991)。 – jhoffman0x

10

ベクトルインデックスを作成します。あなたが両方の配列内の項目のベクトルインデックスのために持っているよりも

struct CmpMass { 
    { 
     CmpMass(vector<double>& vec) : values(vec){} 
     bool operator() (const int& a, const int& b) const 
     { 
      return values[a] < values[b]; 
     } 
     vector<double>& values; 
    } 

sort(indexes.begin(), indexes.end(), CmpMass(mass)); 

より0..N-1の値でそれを埋めます。アクセント中に正しい順序で質量/速度ベクトルを作成することができます:質量[indexes [i]]、速度[indexes [i]]

5

なぜあなたはstd::pairを使用していない、あなたがリンクされている2つの値を持っているとして、あなたはその後、ポインタを経由してstd::sort関数に渡すために、独自の比較方法/機能を実装することができるよりも(std::sortのオーバーロードされたバージョンが存在してサポートしていますそれ)。

しかし、他のstd::sortSEGFAULT

につながる可能性があるため、あなたが strict weak orderingを実装していることを確認してください
関連する問題