在c / c ++中实现未知表模式的数据结构?

时间:2013-01-19 19:47:41

标签: c++ sql c data-structures

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

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

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

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

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

感谢任何帮助。 感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

这也有一个优点,即列名可以存储在相同的类型中。

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

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

答案 2 :(得分:1)

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

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

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

我将把剩下的部分留给OP去弄清楚。