【问题标题】:"Locking" two vectors and sorting them“锁定”两个向量并对它们进行排序
【发布时间】:2011-12-30 04:19:14
【问题描述】:

我有这两个vector<double> 的mass 和velocity 两者的大小相同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 particle
{

double mass;
double velocity;


bool operator < (const particle& str) const

 {
    return (mass < str.mass);
  }



};

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

我不想将我的数据以结构数组的方式放入,因为我听说与数组结构方法相比它效率低下(至少在 CUDA 中)。

【问题讨论】:

  • 更好地定义“锁定”是指如果一个人更改一个属性,其他人以相同的方式更改?
  • 我已经进行了编辑并澄清了问题。
  • sort(zip(mass.all(), velocity.all())) 如果我们有 Alexandrescu 的范围 :)
  • 关于效率——这取决于您的数据访问模式。如果处理粒子需要同时查看质量和速度,则必须同时从内存中读取这两个值,在这种情况下,将它们同时加载到缓存中是有利的(即,使用结构数组)。如果你有两个单独的处理通道,一个只看质量,一个只看速度,那么数组结构可能会更好,这样每个进程都可以最有效地利用高速缓存,而不是一半它被一个不相关的价值所浪费。

标签: c++ sorting stl


【解决方案1】:

创建向量索引;用值 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]]

【讨论】:

    【解决方案2】:

    至少据我所知,标准库中内置的排序算法都不会直接为您执行此操作。最明显的可能性可能是使用 Boost Zip Iterator 使两个数组表现得像一个集合。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 2016-12-03
        • 2022-10-04
        • 2023-03-18
        • 2016-09-23
        • 2014-04-08
        • 2020-08-09
        • 2015-05-06
        • 2011-05-30
        相关资源
        最近更新 更多