锁定两个向量并进行排序

9
我有两个大小相同的vector<double>,它们分别是mass和velocity。它们包含N个粒子的质量和速度信息。因此,mass[i]和velocity[i]是第i个粒子的属性。
在C++中可以将这两个向量"锁定"在一起,并按质量升序排序吗?因此,在排序后,向量mass应按递增顺序排列,并且velocity向量应包含已排序质量的相应速度。
例如,在排序之前mass = (4,2,1,3)和velocity = (13, 14,15,16),排序之后mass=(1,2,3,4)和velocity =(15, 14, 16, 13)。
我知道这种情况下(非高效方法)将数据传输到结构体的向量中。
struct particle
{

double mass;
double velocity;


bool operator < (const particle& str) const

 {
    return (mass < str.mass);
  }



};

创建vector<particle> particlelist(N),然后使用重载<运算符的方式通过std::sort对该向量进行排序,如上述定义所示。

我不想采用结构体数组的方式存储数据,因为我听说相比于数组结构,这种方式效率低下(至少在CUDA中是这样)。


请更好地定义“锁定”,您是指如果一个人更改属性,另一个人会以相同的方式更改吗? - John Riselvato
我已经进行了编辑并澄清了问题。 - smilingbuddha
相关:https://dev59.com/tU_Ta4cB1Zd3GeqPBYWl - John Bartholomew
1
如果我们拥有Alexandrescu的ranges,就可以这样做:sort(zip(mass.all(), velocity.all())) - R. Martinho Fernandes
2
关于效率——它取决于您的数据访问模式。如果处理一个粒子需要同时查看质量和速度,那么这两个值都必须一次性从内存中读取,此时最好同时将它们加载到缓存中(即使用结构体数组)。如果您有两个单独的处理过程,一个只查看质量,另一个只查看速度,则结构体数组很可能更好,以便每个过程可以最有效地利用缓存内存,并且不会因为无关值而浪费一半的内存。 - John Bartholomew
(当然,以上只是一个经验法则指南--还有其他因素涉及在内;一如既往,要了解真正的性能,您必须进行测量) - John Bartholomew
3个回答

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]]。


6
据我所知,标准库中内置的排序算法都不能直接实现此功能。最明显的可能性可能是使用Boost Zip Iterator,使两个数组像单个集合一样操作。

5
为什么不使用 std::pair,因为你有两个相关联的值,你可以实现自己的比较方法/函数,并通过指针将其传递给 std::sort 函数(存在一个支持此功能的重载版本的 std::sort)。
但一定要确保实现了 严格弱序,否则 std::sort 可能会导致 SEGFAULT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接