在我的代码中,我正在处理一组测量(浮动向量),其中每个元素都有两个相关的不确定性(比如+ 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;
}
答案 0 :(得分:7)
此:
其中每个元素都有两个相关的不确定性(比如+ up / -down)
对我说,你有一个包含三个元素的对象(值+上/下)。因此,我会创建该对象并将它们存储在一个向量中。
使用多个向量进行存储意味着您必须使它们保持同步(在事务处理中添加等)。这至多是麻烦的,你必须将这些载体封装起来才能安全。
答案 1 :(得分:2)
三元组的载体怎么样?
#include <array>
#include <vector>
using Measurement = std::array<float, 3>;
std::vector<Measurement> data;
答案 2 :(得分:1)
我会创建一个名为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] << " ";
}
}
从这里可以很容易地使用测量结构的矢量。如果您可以为您的数据使用一个容器,那么它总是最好的。如果你考虑一下,所有三个向量中的所有数据在计数和容量上都是相同的,不需要额外的开销;一个矢量可以节省时空。