"Locking"两个向量并对其进行排序

"Locking" two vectors and sorting them

本文关键字:排序 两个 Locking 向量      更新时间:2023-10-16

我有两个相同大小的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);
  }

};

并创建vector<particle> particlelist(N),然后通过重载<操作符使用std::sort对这个向量进行排序,就像我在上面的定义中所做的那样。

我不想把我的数据放入数组结构时尚,因为我听说它是低效的相比,数组的结构方法(至少在CUDA)。

创建矢量索引;用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));

比两个数组中元素的向量索引顺序要多。然后,您可以以正确的顺序创建质量/速度矢量或在访问期间转换索引:质量[索引[i]],速度[索引[i]]

至少据我所知,标准库中内置的排序算法都不会直接为您做这件事。最明显的可能是使用Boost Zip Iterator使这两个数组像单个集合一样运行。

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

但是要确保实现了严格的弱排序,否则std::sort可能会导致SEGFAULT