2

我们的任务是从文件中读取有关表模式的信息,在 c/c++ 中实现该表,然后在其上成功运行一些“选择”查询。表模式文件可能有这样的内容,

    Tablename- Student
    "ID","int(11)","NO","PRIMARY","0","".

现在,我的问题是什么数据结构适合这项任务。问题是我不知道一个表可能有多少列,也不知道这些列的名称是什么,也不知道它们的数据类型。例如,一个表可能只有一个 int 类型的列,另一个可能有 15 个不同数据类型的列。事实上,我什至不知道架构文件中可能有多少表的描述。

我想到的一种方法是设置一组例如 20 个向量(假设表中列的上限是 20),将这些向量命名为 1stvector、2ndvector 等,将列的名称映射到向量,然后相应地使用它们。但它的代码似乎与所有那些 if/else 语句或 switch case 语句(用于映射)混在一起。

在谷歌搜索/堆栈溢出时,我了解到你不能在运行时描述一个类,否则问题可能更容易解决。

任何帮助表示赞赏。谢谢。

4

3 回答 3

2

作为 C++ 数据结构,您可以尝试使用std::vector< std::vector<boost::any> >. 矢量是标准库的一部分,允许动态调整元素数量。向量的向量意味着任意数量的行和任意数量的列。Boost.Any不是标准库的一部分,但可以广泛使用并允许存储任意类型。

我不知道有任何好的 C++ 库可以对该数据结构进行 SQL 查询。您可能需要自己编写。例如,SQL 命令selectwhere将对应于 STL 算法std::find_if,其中适当的谓词作为函数对象传递。

于 2013-01-19T19:50:02.717 回答
1

为了解决对数据列类型缺乏了解的问题,您几乎必须存储原始输入(即建议的字符串std:string)并在以后根据需要强制解释。

这还具有列名可以以相同类型存储的优点。

如果您真的想确定列类型,您需要推测性地解析输入的每一列以查看它可能是什么并在此基础上做出决定。

无论哪种方式,如果输入可能包含一个列中包含列分隔符号的列(比如一个字符串,在其他空格分隔的数据中包含一个空格),您将必须知道输入的引用约定并编写某种解析到处理数据(吸整行getline是你的朋友)。您的输入似乎是用双引号分隔的字符串以逗号分隔的。

于 2013-01-19T19:58:25.710 回答
1

我建议使用std::vector来保存所有的表创建语句。读入所有创建语句后,就可以构造表了。

要克服的问题是列类型过多。所有 C++ 容器都喜欢有一个统一的类型,例如std::vector<std::string>. 您将有不同的列类型。

一种解决方案是让您的数据类型从单一基数下降。这将允许您为std::vector<Base *>表格的每一行提供指针,其中指针可以指向不同 {child} 类型的字段。

我会把剩下的留给 OP 来解决。

于 2013-01-19T20:01:48.000 回答