如何构造查询表?

时间:2019-09-16 08:01:48

标签: c++ class lookup-tables

我正在实现查找表。

  • 应该有一个索引列,可以是intdoublestring。如果是intdouble,则在查找值时,应查找其落入int的范围(因此,如果索引为0、5、10等,并且查找值为9,它应返回与索引5)相对应的内容。如果它是string,则仅查找完全匹配。
  • 内容是一列或多列,每列也可以(彼此独立并且与索引无关)为intdoublestring
  • 表的数据应存在于一个单独的文件中(无论类型如何,最好是所有表都包含一个文件)。
  • 然后应该以“半动态”方式存储表(即在运行时将其修复,但是我需要能够在两次运行之间更新,添加或修改表)。

我认为我需要创建一个table的基类,无论它们包含什么以及返回什么,它们都放在map中。密钥是table的名称,并从文件中读取。在那之后,我对如何进行感到有些困惑。

我首先想到的是创建某种template,例如template <class INDEX, class CONTENT, int COL, int ROW>,然后定义array<INDEX>[ROW]array<CONTENT>[COL][ROW]。但是当我尝试这样做时,我无法将它们放在相同的map中(因为实例化被解释为不同的类,因此与一种类型不兼容?)。

然后我认为我应该使用继承类结构,将基类放在map中,然后为每种类型的表创建子类。但是,如果是这种情况,我将需要很多 类来覆盖作为三种数据类型之一的index和content列的所有组合。因此,我需要进一步概括一下,然后我想:“为什么不将所有数据存储为string并保留array<int>(甚至是enum?跟踪每列属于哪种情况(即intdoublestring)?”就我看来,这将是一个可能的解决方案,尽管这将是非常丑陋且效率低下的。低效率不是一个大问题,因为tables不会那么大,所以存储strings并在需要时转换为int / double会是可行的,但是我还是想正确地做。另外,还有一个问题,就是table类需要lookup的所有不同版本(即,该类接受并返回intdouble和/或{{1 }}),所以我可能最终在对象上调用了错误的函数(即,当表包含无法从string强制转换的文本时,调用int。)。再次,这不是一个大问题,除了它很丑陋,而且可能不是解决问题的方法。

我还可以使用我未使用的每种类型的“空string”,并跟踪其中的另一个arrays(或array<int>)的数据,以及也许是enum,其中map<int, array<TYPE> >是每一列的类型,然后根据我要查找的列来确定TYPE包含了我已保存/需要的内容。但这让人感到更加困惑和尴尬(但也许我错了)。

或者,我可以,当然,开始将表拆分成较小的表(即,也许所有表都有一个索引,只有一个内容列,或者甚至有一个连接到“索引列”的结构)一个或多个“内容列”)。但是然后我需要找出一种整齐的方法来做,到目前为止我还没有做到。

无论如何,数据文件可能看起来像:

array

有人对如何解决此问题有任何提示或建议吗?

0 个答案:

没有答案