2011-11-16 58 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

相关问题