【发布时间】:2017-06-27 15:35:26
【问题描述】:
假设我有一个类似于以下的类:
struct Potato {
Eigen::Vector3d position;
double weight, size;
string name;
};
还有Potatos的集合
std::vector<Potato> potato_farm = {potato1, potato2, ...};
这很明显是一个结构数组 (AoS) 布局,因为假设对于大多数用途,将所有 Potato 的数据集中在一起是有意义的。但是,我可能想计算最常见的名称,其中数组结构 (SoA) 设计使事物与具有名称的事物类型无关(所有人都有名字的数组,地点数组,都带有名称等)C++ 是否有任何工具或技巧可以使 AoS 布局看起来像 SoA 以执行此类操作,或者是否有更好的设计来完成相同的操作? p>
【问题讨论】:
-
如何让它变得更容易?或者现在如何计算平均值并不容易?只需遍历您的
potato_farm,访问权重,计算平均值,完成。当然,如果您的意思是内存效率更高,那么拥有数组结构可能会有优势,但我不明白不同“外观”的意义,因为获取平均权重的代码差别不大 -
@tobi303 与具有数组结构的 STL 算法交互要自然得多(每个数组都将具有
begin和end方法,它们可以原生地提供例如std::accumulate而无需写一大堆lambda函数来挖掘相关的成员变量)。 -
@ConnorGlosser 不过,您只需为
std::accumulate编写一个 lambda,不需要太多。使用您的 IMO 数组结构并不“容易”。 -
@ConnorGlosser 是的,我正在考虑,您必须编写一些样板文件才能使
std::accumulate访问成员 -
您的
potato_farm可以为每个成员提供begin和end迭代器。该迭代器简单地包装了向量迭代器,但在取消引用时返回适当的成员。然后你会保存 lambdas