2011-11-16 33 views
9

我有這兩個vector<double>massvelocity都有相同的大小N。它們包含有關N粒子質量和速度的信息。 mass[i]velocity[i]因此是第i個粒子的屬性「鎖定」兩個載體,並對它們進行分類

是否有可能在C++中將這兩個向量「鎖定」在一起並按照質量遞增的順序對它們進行排序?因此,在排序之後,矢量mass應該是遞增的順序,並且速度矢量應該包含相應的分選質量的速度。在分選質量=(4,2,1,3)和速度=(13,14,15,16) 之前,將質量=(1,2,3,4)和速度=(15,14,16,13 )

我知道這種情況的一個(非有效)的方法是通過使用std::sort通過重載<數據傳輸到的結構的

struct particle 
{ 

double mass; 
double velocity; 


bool operator < (const particle& str) const 

{ 
    return (mass < str.mass); 
    } 



}; 

一個矢量,並創建vector<particle> particlelist(N)然後排序此載體正如我在上面的定義中所做的那樣。

我不想把我的數據放入結構數組中,因爲我聽說與數組結構方法(至少在CUDA中)相比效率低下。

+0

定義「鎖定」好,你的意思是像如果一個人改變一個屬性的其他變化,我都如此? –

+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

[zip_iterator不適用於std :: sort](http://stackoverflow.com/a/9343991)。 – jhoffman0x

10

創建向量索引;用值0..n-1填充它比

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)); 

比你在兩個數組中的項目的向量索引順序中都要多。你可以按照正確的順序創建質量/速度矢量,或者在訪問期間轉換索引:mass [indexes [i]],velocity [indexes [i]]

5

你爲什麼不使用std::pair因爲你有兩個被鏈接的值,你比則可以實現自己的比較方法/函數指針通過對傳遞給std::sort功能(存在的std::sort重載版本,它支持那)。

不過可以肯定的是你有一個strict weak ordering實現的,因爲別的std::sort可能導致SEGFAULT

相關問題