最有效的方法来存储混合的双打和INT集合
-
21-09-2019 - |
题
我需要在C ++中存储一个INT和双打(代表名义和实际有价值数据)的集合。我显然可以将它们全部存放在 std::vector<double>
,但这感觉有点错,没有获得美学奖励点。
我也可以根据多态性烹饪一些东西,但是我还需要该集合非常有效:存储和检索集合中的数据都应尽快。我发现很难判断这样的解决方案是否最大程度地有效。
我也发现 boost ::变体, ,这可能在这里有所帮助。
附加信息:集合中的项目数量很小(<100),并在初始化集合时已知。
总结:我显然可以以无数的方式解决这个问题,但是当(i)效率非常重要时,我不确定什么是一个好的解决方案,并且(ii)我也想编写一些不错的代码。我最好的选择是什么?
编辑,其他信息: 该集合代表较大数据集中的“行”,其元素表示某些“列”的值。行的属性是已知的,因此已知在哪个位置存储了哪种数据。我谈论的“效率”主要是检索特定列的int/double值的效率,尽管快速设置值也很重要。我有一些功能可以在需要尽快检索数据的数据上运行。例子:
typedef std::vector<double> Row;
void doubleFun(Row const &row)
{
// Function knows there's always a double at index 0
double value = row[0];
...
}
void integerFun(Row const &row)
{
// Function knows there's always an integer at index 1
int value = row[1];
...
}
在进行了更多思考并阅读到目前为止的建议之后,似乎仅将int列和双列存储在两个单独的向量中是一个可靠的解决方案。收藏 Row
然后,可以仅定义两个不同的成员来检索功能可以使用的名义和真实数据。
只是存储 vector<double>
我猜还可以,但这取决于双重和int之间的转换速度(这可能令人印象深刻)。
很抱歉起初有点不清楚,我希望它更清楚,现在我可以对此事有更多想法。
解决方案
订购您的容器中的重要一点吗?
如果不是这样,
class MyContainer
{
std::vector<double> doubles;
std::vector<int> ints;
push(double value) { doubles.push_back(value); }
push(int value) { ints.push_back(value); }
....
};
迭代器部分(浏览整个容器)可能会更棘手...
其他提示
为什么不直接使用双重矢量?由于整数可以转换为双打而不会损失精度……它在我看来是最简单,最有效的解决方案。
还有什么要设置的(我无法从您的问题中弄清楚)如何使正常和真实值之间的区别。您可能选择的任何解决方案中的问题仍然开放。
您可以使用联合类型并在矢量中使用它。但是,在这种情况下,您必须有一些方法来知道该向量的哪些要素应被视为INT,并且应将其视为双打。为了跟踪哪些是ints,哪些是双打,您可以使用bitset或类似的东西。
我不确定您的目标是否是避免重大的浮点计算。如果是,那么斑点可能会更有效。如果不是,并且确切的int精度并不重要,那么您不妨将它们全部存储为双打。
#include <vector>
#include <bitset>
union di
{
double d;
int i;
};
int main(int argc, char* argv[])
{
std::bitset<2> bitsetInts;
std::vector<di> v;
di e1;
e1.d = 3.9;
v.push_back(e1);
di e2;
e2.i = 3;
bitsetInts.set(1);
v.push_back(e2);
return 0;
}
我会去找 boost::variant
解决方案,它非常适合您的需求。
有增强元组,如果您在编译时知道类型,则可以使用。但是,如果项目数量很少,那么在浪费100个字节的情况下,不应该担心。