【问题标题】:Data structure which supports table lookups支持表查找的数据结构
【发布时间】:2013-05-03 21:23:38
【问题描述】:

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

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

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

等

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

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

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

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

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

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

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

谢谢。

【问题讨论】:

  • 也许是 Boost.MultiIndex?
  • 什么,你的意思是某种std::map?但是,您的第二个约束似乎暗示您需要一些自定义的东西。
  • std::map<:vector>, std::string> 会起作用吗?
  • 嗯,这种方法可行,但查找成本非常高。

标签: c++ algorithm database-design data-structures


【解决方案1】:

您可能希望创建一个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
}

Ideone 上的输出。

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

【讨论】:

  • 这是一个不错的解决方案。谢谢。这是 c++11 特有的功能,我们使用的是旧版本的编译器。列也可以是整数和字符串的混合(我会更新问题)。
  • 在某些时候,您可能最好使用 C++ 接口连接到执行数据存储/持久性/事务等的关系数据库。
  • 是的,但是每次查找查询数据库都会产生巨大的开销。
  • 我喜欢你的解决方案。在这种情况下,我担心查找的成本。本质上,我们是在比较非常昂贵的向量。
  • @KodeWarrior 但 C++ 数据库库的作者会考虑到这一点,实现您可能从未想过的缓存策略。看,如果数据库很小,那么你做什么都没关系,但如果它真的很大,你可能已经在磁盘上,现在你必须担心分页、持久性、事务语义等。我会去的对于任何大的图书馆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2013-10-03
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多