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

smi*_*dha 9 c++ sorting stl

我有这个两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) )

我知道的一种(非高效)方式是将数据传输到struct的向量中

struct particle
{

double mass;
double velocity;


bool operator < (const particle& str) const

 {
    return (mass < str.mass);
  }



};
Run Code Online (Sandbox Code Playgroud)

vector<particle> particlelist(N)然后使用std::sortby重载<运算符创建然后对此向量进行排序,就像我在上面的定义中所做的那样.

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

小智 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));
Run Code Online (Sandbox Code Playgroud)

比你在矢量索引中的两个数组中的项目顺序.您可以在正确的顺序中创建质量/速度矢量或在访问期间转换索引:mass [indices [i]],velocity [indices [i]]


Jer*_*fin 5

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

  • [zip_iterator不能与std :: sort一起使用](http://stackoverflow.com/a/9343991). (2认同)

Sim*_*Sim 5

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

但要确保你实施了严格的弱订单,因为否则std::sort可能导致aSEGFAULT


归档时间:

查看次数:

3879 次

最近记录:

8 年,1 月 前