C++异构类型列的表(集合)

C++ table (collection) of heterogenuously types columns

本文关键字:集合 异构 类型 C++      更新时间:2023-10-16

我正在尝试为C++中的表或关系(具有唯一行的无序表)构建数据结构。我以前用过很多次,但自己从未建造过。

因此,该表应该是任意数量的任意类型的列的集合。我可以使用std::vector<some_type>或一些派生类来表示列。

我的问题是我可以使用什么语言结构来定义总体表数据结构?我意识到我可以以某种方式std::vector<some_type>包装到某个类中,该类本身可以派生出某个基类,然后将表表示为指向基类的指针向量,但我有点好奇是否有替代方法来表示,也许使用一些模板签名?我宁愿在使用表的列时不要投射太多。

给出一些背景。我很乐意使用我所描述的那种现有的数据结构。我已经看到这样的结构在软件行业中非常积极地与关系代数算法一起使用,但我还没有发现这样的结构在 boost 中。我对在其上实现基本的关系运算符特别感兴趣,例如连接、产品等......

编辑:更多细节。我不想创建具有基于行的内存连续性的数据结构。重要的是,邻接性是基于列的,因此拥有向量集合似乎是正确的做法。

您使用的数据结构可能取决于您最常执行的关系操作。

例如,如果要

对两个表执行联接,有多种方法可以执行此操作。 可以使用嵌套循环联接,在这种情况下,无需通过特定键快速访问表中的特定行。 另一方面,如果使用哈希连接,则可以通过给定键快速获取特定行。

但是,选择使用哪种类型的联接是查询优化中的一个相关问题,它有几个因素(数据库中数据的基数估计等)。

但总的来说,我会做以下几点:

  1. 创建一个对象来表示数据中的行。 此对象可以包含您拥有的不同列的列表。 如果您有通常对其执行操作的单个键,请将其存储在其自己的变量中。 否则,您可以存储列值的哈希集以进行快速查找(这仅在您有很多列时才值得)。
  2. 让此对象表示数据"行"后,确定最常执行的操作类型。 例如,如果您需要排序的操作,则可以使用 stl map 按特定键存储这些行,该映射实现红黑树,并且可以有效地获取键。 如果您需要在给定时间快速访问特定行(例如,由于查询中的过滤器),则可以使用哈希映射

tl/dr:以最佳方式存储行取决于您最常期望的操作类型和数据分布。 无论如何,我认为创建一个类来存储"行"的概念是合乎逻辑的,然后您可以根据您的用例使用各种数据结构排列这些行。