Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
支持表查找的数据结构 我有一个用例,我必须将以下表中的表表示形式存储在C++实现的数据结构中,并支持某些查询< /P>_C++_Algorithm_Database Design_Data Structures - Fatal编程技术网

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

支持表查找的数据结构 我有一个用例,我必须将以下表中的表表示形式存储在C++实现的数据结构中,并支持某些查询< /P>,c++,algorithm,database-design,data-structures,C++,Algorithm,Database Design,Data Structures,[“Col1”、“Col2”、“Col3”、“Col4”、“Col5”] [“V1”、“V2”、“V3”、“V4”、“Value1”] 等 Col1、Col2、Col3、Col4、Col5一起构成主键。此外,Col1、2为字符串类型,2、4和5为整数类型 数据结构应支持以下操作: 支持每行的插入操作 给定Col1、Col2、Col3、Col4的值,找到Col5的值 给定Col1、Col2、COl3、Col4更新Col5 我正在考虑实现一个树并支持查找。有没有标准算法/更简单的方法来解决这个问题

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

[“V1”、“V2”、“V3”、“V4”、“Value1”]

Col1、Col2、Col3、Col4、Col5一起构成主键。此外,Col1、2为字符串类型,2、4和5为整数类型

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

  • 支持每行的插入操作

  • 给定Col1、Col2、Col3、Col4的值,找到Col5的值

  • 给定Col1、Col2、COl3、Col4更新Col5

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

    伪代码/伪代码将受到赞赏


    谢谢。

    您可能需要制作一个
    std::map
    ,前4列作为键,第5列作为值。我将列设置为混合的
    std::string
    int
    类型,但您可以将其概括为任何您喜欢的类型

    #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
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    typedef std::mapTable;
    int main()
    {
    我的桌子;
    std::string a=“Kode”,b=“Warrior”;
    int c=3,d=4,e=5;
    //1.支持每行插入操作。
    my_table.insert(std::make_pair(std::make_tuple(a,b,c,d),e));
    //2.给定Col1、Col2、Col3、Col4的值,找到Col5的值
    autoit=my_table.find(std::make_tuple(a,b,c,d));
    std::cout second;//打印e
    //3.给定Col1、Col2、COl3、Col4更新Col5
    it->second=6;//分配一些其他值
    }
    
    输出打开


    一个很大的缺点(但不在您的需求中):它不支持列插入,所以它不是电子表格的好模型。您可以尝试使用
    std::map
    ,如@narutsereeewattanawoot在注释中所述。您可以修改代码以支持这一点,但需要一些初始值设定项列表机制来获得具有紧凑查找语法的make_向量。另外,
    std::vector
    作为键的缺点是需要类型同质性,而
    std::tuple
    可以避免这种同质性。如果你想得到真正的pancy,你可以用一个
    std::vector
    作为键,它可以灵活地进行类型转换和列大小转换。

    ?可能是Boost.MultiIndex?什么,你是说某种类型的?然而,您的第二个约束似乎暗示您需要一些定制的东西。std::map可以工作吗?好的,这种方法可以工作,但查找成本非常高。这是一个很好的解决方案。谢谢这是一个c++11特有的特性,我们使用的是较旧版本的编译器。此外,列可以是int和字符串的混合(我会更新这个问题)。在某个时候,你最好用C++接口来连接数据存储/持久化/事务等关系数据库。但是,每次查询都要查询数据库,这是一个巨大的开销。我喜欢你的解决方案。我担心在这种情况下查找的成本。本质上,我们正在比较非常昂贵的向量。@ KodeWarrior,但是C++数据库库的作者会想到这一点,实现缓存策略,而这些策略可能是您永远不会想到的。听着,如果数据库很小,那么你做什么无关紧要,但是如果它真的很大,你可能会把它放在磁盘上,现在你不得不担心分页、持久性、事务语义等等。我会为任何大的东西找一个库。