如何在C ++中实现多维关联数组?

时间:2012-11-29 14:17:26

标签: c++ system-verilog systemc

我正在将一些SystemVerilog移植到SystemC / C ++,并且遇到了多维关联数组的问题。考虑在SV中声明这个数组。

// assume typ_one, typ_two, typ_three are struct or enum types
typ_one mda[typ_two][typ_two][typ_three];

我知道一维关联数组我可以使用一个映射,而二维数组就是一个嵌套映射,我相信一个类似的方法可以解决多维数组,但它会变得非常混乱。

typ_one mda[typ_two];
map< typ_two, typ_one >;

typ_one mda[typ_two][typ_two];
map< typ_two, map< typ_two, typ_one > >;

typ_one mda[typ_two][typ_two][typ_three];
map< typ_two, map< typ_two, map< typ_three, typ_one > > >;

所以我的问题是,

(1)是上述正确的,因为mda[x][y][z]形式的操作将返回与SV代码相同的期望值?

(2)有更好,更清洁的方式吗?

3 个答案:

答案 0 :(得分:1)

你的std :: map示例会做你想要的。

不幸的是,没有更简洁的方法,因为C ++没有特殊的关联数组语法,就像普通数组一样(不幸的是那些是原始的“原始”数组,而不是Java / C#中的数组对象。) p>

答案 1 :(得分:0)

  template<class T1, class T2, class ... Ts>
  struct MultiDimensionalMap{
      typedef std::map<T1, typename MultiDimensionalMap<T2,Ts...>::map_type> map_type;
  };

  template<class T1, class T2>
  struct MultiDimensionalMap<T1,T2>{
      typedef std::map<T1,T2> map_type;

  };

有了这个,对于你的例子,你将使用以下

MultiDimensionalMap<type_two,type_two,type_three,type_one>::map_type m;

答案 2 :(得分:0)

实施该方法至少有两种方法。

  • 第一个是使用嵌套地图,正如您在问题中建议的那样:地图或地图等地图到所需的嵌套级别。

  • 第二种方法是使用普通线性映射,其中键是索引元组(即3D关联数组的3个索引)。

我实际上会考虑采用第二种方法,除非你有特别的理由坚持第一种方法。