我需要在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个字节的情况下,不应该担心。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top