2

我有一个用例,我必须将以下以表的形式表示在用 C++ 实现的数据结构中,并支持某些查询集

[“Col1”、“Col2”、“Col3”、“Col4”、“Col5”]

[“V1”、“V2”、“V3”、“V4”、“值1”]

ETC

Col1, Col2, Col3, Col4, Col5 共同构成一个主键。Col1, 2 也是字符串类型,2, 4 和 5 是整数类型。

数据结构应支持以下操作:

  1. 支持每一行的插入操作。

  2. 给定 Col1、Col2、Col3、Col4 的值,求 Col5 的值

  3. 给定 Col1、Col2、COl3、Col4 更新 Col5

我正在考虑实现树并支持查找。是否有标准算法/更简单的方法来解决这个问题?

伪代码/代码将不胜感激。

谢谢。

4

1 回答 1

3

您可能希望将std::map前 4 列作为键,将第 5 列作为值。我已经将列分为混合类型std::stringint类型,但是您可以将其概括为您喜欢的任何内容。

#include <map>
#include <utility>
#include <tuple>
#include <iostream>
#include <string>

typedef std::map< std::tuple<std::string, std::string, int, int>, int> Table;

int main()
{
    Table my_table;
    std::string a = "Kode", b = "Warrior"; 
    int c = 3, d = 4, e = 5;

    // 1. Support insert operations for each row.
    my_table.insert(std::make_pair(std::make_tuple(a, b, c, d), e));

    // 2. Given the values for Col1, Col2, Col3, Col4 find the value of Col5
    auto it = my_table.find(std::make_tuple(a, b, c, d));
    std::cout << it->second; // prints e

    // 3. Given Col1, Col2, COl3, Col4 update Col5
    it->second = 6; // assign some other value
}

Ideone上输出。

一个很大的缺点(但它不在您的要求中):它不支持列插入,因此它不是电子表格的好模型。您可以尝试使用std::map< std::vector<std::string>, std::string>@NarutSereewattanawoot 在评论中提到的那样。您可以修改代码以支持它,但您需要一些初始化列表机制来获得 make_vector 以具有紧凑的查找语法。OTOH, astd::vector作为键的缺点是您需要std::tuple避免类型同质性。如果您想获得真正的花哨,您可以将 astd::vector<boost::any>作为键,它既是类型灵活的,也是列大小灵活的。

于 2013-05-03T21:49:35.000 回答