“锁定”两个向量并对它们进行排序

时间:2011-11-16 07:04:38

标签: c++ sorting stl

我有两个vector<double>的{​​{1}} massvelocity两个大小相同N。它们包含有关N粒子质量和速度的信息。 mass[i]velocity[i]因此是第i个粒子的属性

在C ++中是否可以将这两个向量“锁定”在一起并按质量递增顺序对它们进行排序? 因此,在排序后,矢量mass应该按递增顺序排列,速度矢量应该包含排序质量的相应速度

e.g。在排序质量=(4,2,1,3)和速度=(13,14,16,16)之前      排序后质量=(1,2,3,4)和速度=(15,14,16,13)

我知道的一种(非效率)方法是将数据传输到struct的

向量中
struct particle
{

double mass;
double velocity;


bool operator < (const particle& str) const

 {
    return (mass < str.mass);
  }



};

并创建vector<particle> particlelist(N),然后使用std::sort<运算符进行排序,重载{{1}}运算符,就像我在上面的定义中所做的那样。

我不想把我的数据放入Array of Structures时尚,因为我听说它与阵列结构方法相比效率低(至少在CUDA中)。

3 个答案:

答案 0 :(得分: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 [indices [i]],velocity [indices [i]]

答案 1 :(得分:5)

至少据我所知,标准库中内置的排序算法都不能直接为您完成。最明显的可能性可能是使用Boost Zip Iterator来使两个数组像一个集合一样。

答案 2 :(得分:5)

为什么不使用std::pair,因为你有两个链接的值,然后你可以实现自己的比较方法/函数通过指针传递给std::sort函数(存在) std::sort的重载版本,支持该版本。

但请确保您已实施strict weak ordering,否则std::sort可能会导致SEGFAULT