向量对还是向量对?
Posted
技术标签:
【中文标题】向量对还是向量对?【英文标题】:Vector of pairs or pair of vectors? 【发布时间】:2013-10-02 14:53:56 【问题描述】:在我的代码中,我正在处理一组测量值(浮点向量),其中每个元素都有两个相关的不确定性(比如 +up/-down)。 假设我想在屏幕上转储这些值,例如
Loop over the vector of the measurements
cout << i-th central value << " +" << i-th up uncertainty << " / -" << i-th down uncertainty << end;
最有效/最优雅的方法是什么?
1) 使用一对向量
vector<float> central; //central measurement
pair<vector<float>, vector<float>> errors; //errors
for( int i = 0; i < central.size ; i++ )
cout << central.at(i) << " +" << errors.first.at(i) << " / -" << errors.second.at(i) << endl;
2) 使用对向量:
vector<float> central; //central measurement
vector<pair<float,float>> errors; //errors
for( int i = 0; i < central.size ; i++ )
cout << central.at(i) << " +" << errors.at(i).first << " / -" << errors.at(i).second << endl;
3) 两个独立的向量:
vector<float> central; //central measurement
vector<float> errUp; //errors up
vector<float> errDown; //errors down
for( int i = 0; i < central.size ; i++ )
cout << central.at(i) << " +" << errUp.at(i) << " / -" << errDown.at(i) << endl;
【问题讨论】:
创建一个包含所有三个数据的struct
。
【参考方案1】:
这个:
其中每个元素都有两个相关的不确定性(比如 +up/-down)
对我说你有一个包含三个元素的对象(值 + 上/下)。因此,我会创建该对象并将它们存储在单个向量中。
使用多个向量进行存储意味着您必须使它们保持同步(以事务方式添加到两者等)。这充其量是很麻烦的,您必须封装这些向量以确保安全。
【讨论】:
您的建议(以及 Kerrek 的)将是理想的,问题是“中心”,并且在代码的不同部分评估不确定性:有一个“测量”类执行所有任务以获得“中心”向量,以及评估不确定性的另一个类“SystematicUncertainties”。特别是,我目前正在设计 SystematicUncertainties 类,由于会有大约 50 个不同的不确定性来源(即大约 50 个潜在的“上下”向量),我想尝试尽可能高效地实现它。【参考方案2】:三元组向量怎么样?
#include <array>
#include <vector>
using Measurement = std::array<float, 3>;
std::vector<Measurement> data;
【讨论】:
【参考方案3】:我会为单一职责创建一个名为 Measurement 的类或结构。您可能不需要上下两个不确定性值。大多数情况下,无论符号如何,它们都是相同的,这意味着一个不确定值可能就可以了。
struct Measurement
union
float values[3];
struct float value, uncertaintyUp, uncertaintyDown; ;
;
使用联合将为您提供所需的可读性,以及 [] 运算符的灵活性。
main()
Measurement x;
x.value = 1.0f;
x.uncertaintyUp = 0.1f;
x.uncertaintyDown = -0.1f;
for(int i = 0; i < 3; i++)
cout << x.values[i] << " ";
从这里可以很简单地使用测量结构的向量。如果您可以为您的数据使用一个容器,那总是最好的。如果您考虑一下,所有三个向量中的所有数据在计数和容量方面一直都是相同的,不需要额外的开销;一个向量可以节省空间。
【讨论】:
单一责任原则。为一项特定的工作创建一个特定的类是关键。 +1 我从来没有见过这样的东西,union 的使用真棒。以上是关于向量对还是向量对?的主要内容,如果未能解决你的问题,请参考以下文章