表的stl容器

时间:2011-06-05 13:18:27

标签: c++ stl

表是否有任何数据结构?喜欢存储这个:

    Width    Height
1     5        10
2     3        20
3     10       2

我需要的是按行号和标题来处理值,例如: (2,“高度”)将给出20.
我知道我可以做一组地图或二维数组和一个地图作为列名到数字,但是有一个现成的数据结构吗?

5 个答案:

答案 0 :(得分:3)

结构数组会做什么,不是吗?

答案 1 :(得分:3)

没有直接准备,但STL很精彩,你可以随时结合你的方式:

#include <map>
#include <vector>
#include <string>
#include <iostream>

typedef std::map<std::string, int> col_val_map;
typedef std::vector<col_val_map> table;

int main(){
  table t(3);

  std::string col = "Width";
  t[0][col] = 5;
  t[1][col] = 3;
  t[2][col] = 10;

  col = "Height";
  t[0][col] = 10;
  t[1][col] = 20;
  t[2][col] = 2;

  col = "Random";
  t[0][col] = 42;
  t[1][col] = 1337;
  t[2][col] = 0;

  std::cout << "\t\tWidth\t\tHeigth\t\tRandom\n";
  for(int i=1; i <= 3; ++i){
    std::cout << i << "\t\t" << t[i-1]["Width"]
                   << "\t\t" << t[i-1]["Height"]
                   << "\t\t" << t[i-1]["Random"]
                   << "\n";
  }
}

输出显示在Ideone

或者,正如@DeadMG所说的那样,反过来说:

#include <map>
#include <vector>
#include <string>
#include <iostream>

typedef std::vector<int> row_val_array;
typedef std::map<std::string,row_val_array> table;

int main(){
  table t;
  t["Width"].reserve(3);
  t["Width"][0] = 5;
  t["Width"][1] = 3;
  t["Width"][2] = 10;

  t["Height"].reserve(3);
  t["Height"][0] = 10;
  t["Height"][1] = 20;
  t["Height"][2] = 2;

  t["Random"].reserve(3);
  t["Random"][0] = 42;
  t["Random"][1] = 1337;
  t["Random"][2] = 0;      

  std::cout << "\t\tWidth\t\tHeigth\t\tRandom\n";
  for(int i=1; i <= 3; ++i){
    std::cout << i << "\t\t" << t["Width"][i-1]
                   << "\t\t" << t["Height"][i-1]
                   << "\t\t" << t["Random"][i-1]
                   << "\n";
  }
}

再次显示在Ideone

答案 2 :(得分:2)

你看过Boost::MultiIndex了吗?它几乎就像是数据库表的内存表示。您可以查询多行,单行等。非常强大,非常有用,我认为它可以解决你所问的问题。

来自提升网站:

  

Boost.MultiIndex具有其他功能,如子对象搜索,范围查询和元素的就地更新,这使得它可以方便地替换std :: set和set :: multiset,即使不需要多索引功能也是如此。

在您的情况下,我会查看composite_key

答案 3 :(得分:0)

我不敢在C ++标准库中。当然,很多人已经实现了这样的事情 - 你可以看到我自己的相当简单的实现herehere

答案 4 :(得分:0)

如果您的表格稀疏(几乎为空),那么使用std::map作为关键字的单std::pair<int, std::string>是一个很好的解决方案。

唯一的非平凡算法是有效地迭代列(但可以使用std::map::lower_bound合理地完成)。