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

Data structures to implement unknown table schema in c/c++?

本文关键字:模式 数据结构 未知 实现 c++      更新时间:2023-10-16

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

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

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

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

在google上搜索/stack-overflow时,我了解到你不能在运行时描述一个类,否则这个问题可能更容易解决。

任何帮助都是感激的。谢谢。

作为c++数据结构,您可以尝试std::vector< std::vector<boost::any> >。vector是标准库的一部分,允许动态地重新缩放元素的数量。向量的向量意味着任意数量的行和任意数量的列。提振。Any不是标准库的一部分,但广泛可用,并允许存储任意类型。

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

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

这还有一个好处,即列名可以存储在相同的类型中。

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

无论哪种方式,如果输入可以包含一个列,其中有列分隔符号(说一个字符串,包括空格,否则空格分隔的数据),你必须知道输入的引用约定,并编写某种类型的解析来处理数据(吮吸整行与getline是你的朋友在这里)。

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

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

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

我将把剩下的留给OP去解决。