如何在 C++ 中简单地处理一张表?

bwe*_*r13 2 c++ datatable data-structures

我希望能够处理像 C++ 中的表格之类的东西。我的意思是“excel 电子表格”或“R dataFrame”中的表格。然而,我的解决方案不需要那么强大。我不需要在运行时添加列,但我将添加行来创建平均值。我正在从单个数据点构建此表,并且将在程序的其他地方读取此表以进行数据分析。我觉得像 SQLite 这样的解决方案有点矫枉过正。我怎样才能简单地表示这种数据?

为了更轻松地讨论选项,请考虑以下海洋温度表,我们将其称为data

| DataType    | DateTime         | Location  | Temperature |
| ----------- | ---------------- | --------- | ----------- |
| Observation | 2020-07-03_1325  | buoy 3882 | 18.1        |
| Observation | 2020-07-03_1512  | buoy 3882 | 16.6        |
| Observation | 2020-07-03_1701  | buoy 3882 | 15.8        |
| DailyAvg    | 2020-07-03_0000  | buoy 3882 | 16.8        |
Run Code Online (Sandbox Code Playgroud)

重要的是,我能够访问基于任何属性的数据,以便我可以(在某种程度上)快速收集来自特定位置的所有点、具有相同日期的所有点等。

我已经考虑过制作一个二维数组(类似于std::vector< std::vector<boost::any> >),但这要求用户记住保存他们想要的数据的列的位置。(例如,对于第二个数据点的温度,用户必须使用data[1][3])。我还考虑过制作一个看起来像这样的结构:

struct DataPoint {
    ObservationType observationType;
    DateTime dateTime;
    std::string location;
    double temperature;
}
Run Code Online (Sandbox Code Playgroud)

然后简单地使用 std::vector<DataPoint>来跟踪整个表。

因此,我们提出了我的问题:这两种方法中的任何一种都有意义吗?还有另一种更有意义的方法吗?

其次,在我看来,数据点是不可变的。防止用户在创建后修改数据是否有意义?如果是这样,最好的方法是什么?

Ant*_*dua 5

选项std::vector<DataPoint>看起来很不错。您不需要阻止数据修改,只需使用const创建后。

如果您需要按位置、温度等快速访问行,您可以根据以下内容创建特定索引 map或更复杂的数据结构。

例如,您可以创建std::multimap<double, size_t>其中键是温度而值是表中的行数(向量中的索引)。然后,您可以使用 std::lower_bound 和 std::upper_bound 检索温度在给定范围内的行的所有索引。

  • @bweber13 请参阅 Mooing Duck 在该问题下的评论。不过要小心。如果返回的变量的寿命没有超过引用(例如局部变量),则返回对变量的引用是一个致命错误。 (2认同)