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

标签 c++ data-structures datatable

我希望能够在 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        |

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

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

struct DataPoint {
    ObservationType observationType;
    DateTime dateTime;
    std::string location;
    double temperature;
}

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

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

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

最佳答案

std::vector<DataPoint>的选项看起来不错。不需要防止数据被修改,用const就可以了创建后。

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

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

关于c++ - 如何在 C++ 中简单地处理一张表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63062183/

相关文章:

c# - 如何在 EPPLus 中设置 CSS 样式?

c++ - SFML (C++) 中的正确碰撞

c++ - 如何绑定(bind)或合并 QPainterPaths?

c++ - C++ 中不存在从 "std::wstring"到 "LPWSTR"的合适转换函数

c - 在C中实现队列

algorithm - (非压缩)Trie 的使用

c - 运行时调度抽象

c++ - 找不到重载的成员函数

c# - 从数据表中删除重复项

c# - 使用不同的列模式将行从 DataTable 复制到另一个