2013-05-03 29 views
2

我其中我必须存储在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

我想实现的树和支持查找。有没有标准的算法/更简单的方法来解决这个问题?

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

谢谢。

+1

[你有什么试过](http://mattgemmell.com/2008/12/08/what-have-you-tried/)? – TemplateRex 2013-05-03 21:26:02

+1

也许Boost.MultiIndex? – 2013-05-03 21:26:48

+0

什么,你的意思是某种['std :: map'](http://en.cppreference.com/w/cpp/container/map)?然而,你的第二个约束似乎暗示你需要一些自定义的东西。 – 2013-05-03 21:27:55

回答

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,std::vector作为一个关键的缺点是你需要类型同质性std::tuple避免。如果你想得到真正的幻想,你可以有一个std::vector<boost::any>作为灵活的类型和列大小的关键。

+0

这是一个漂亮的解决方案。谢谢。这是一个特定于C++ 11的特性,我们使用一个较旧版本的编译器。此外,列可以是整数和字符串的混合(我将更新问题)。 – KodeWarrior 2013-05-03 22:02:39

+0

在某些时候,您可能会更喜欢使用C++接口来执行数据存储/持久性/事务处理等关系数据库。 – TemplateRex 2013-05-03 22:07:25

+0

是的,但是查询数据库的每次查找将会花费巨大开销。 – KodeWarrior 2013-05-03 22:20:45