【问题标题】:How to get a vector of different vectors in C++如何在 C++ 中获取不同向量的向量
【发布时间】:2015-02-18 01:15:10
【问题描述】:

我想要一个表的 C++ 表示形式,如下所示:

0   1   2
=   =   =
1  1.0  a
2  2.0  b
3  3.0  c

必须在运行时从intdoublestring 中选择列的类型。

用 C++ 表达它的最佳方式是什么?

附录:我真正的问题:我想要一个可以具有任意 SQL 类型的数据库表的列表示(我将满足于 intdoublestring)。

【问题讨论】:

  • 您可以使用boost::variant,但恕我直言,您的设计有问题。
  • XY 问题。请描述你真正的问题。
  • 或者,只是一个想法,您可以将字符串存储在向量中,然后使用stoistod 等从字符串中读取/写入整数/双精度数。

标签: c++ vector stl


【解决方案1】:

编辑:在运行时创建动态类型的对象,谷歌“工厂模式”。

您需要第一个向量包含一致的类型,因此您可能(在 C++ 中)希望拥有一个基类并从中派生。我不确定 std::vector 类是否有无类型基(它可能)。

因此,您要么围绕向量的概念创建一个包装类 (yuck),要么创建变体类型的向量 (yuck),或者创建某种变体向量 (yuck)。我可能会选择后者,因为它是最简单的方法,其中仍然包含类型安全向量。

typedef union VectorOfThings {
    std::vector<int> i;
    std::vector<double> d;
    std::vector<string> s;
};
struct TypedVectorOfThings {
    enum Type { ints, doubles, strings };
    Type type;
    VectorOfThings myVector;
};
std::vector<TypedVectorOfThings > myVectorOfVectors;

调味。但是,天哪,这太可怕了。这是用户定义的数据库表的运行时表示还是什么?

【讨论】:

  • Is this a run time representation of a user defined database table or something? 完全正确。
【解决方案2】:

可能带有记录/行类:

struct Record
{
    int col1;
    double col2;
    string col3;
}

std::vector<Record> records;

【讨论】:

  • 这种方法在运行时不能选择类型。但是如果 OP 可以放弃这个要求,那么这是最简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2011-01-18
  • 2017-12-22
  • 2023-01-19
相关资源
最近更新 更多