【发布时间】: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<particle> particlelist(N),然后通过重载< 运算符,使用std::sort 对这个向量进行排序,就像我在上面的定义中所做的那样。
我不想将我的数据以结构数组的方式放入,因为我听说与数组结构方法相比它效率低下(至少在 CUDA 中)。
【问题讨论】:
-
更好地定义“锁定”是指如果一个人更改一个属性,其他人以相同的方式更改?
-
我已经进行了编辑并澄清了问题。
-
sort(zip(mass.all(), velocity.all()))如果我们有 Alexandrescu 的范围 :) -
关于效率——这取决于您的数据访问模式。如果处理粒子需要同时查看质量和速度,则必须同时从内存中读取这两个值,在这种情况下,将它们同时加载到缓存中是有利的(即,使用结构数组)。如果你有两个单独的处理通道,一个只看质量,一个只看速度,那么数组结构可能会更好,这样每个进程都可以最有效地利用高速缓存,而不是一半它被一个不相关的价值所浪费。