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

3

我正在将一些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];

我知道对于一维关联数组可以使用 map,对于二维数组可以使用嵌套的 map,而对于多维数组则可以采用类似的方法解决,但这会变得非常混乱。

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) 是否有更好、更清洁的方法?


1
查看 C++11 中的元组 std::tuple 或其他情况下的 boost::tuple - andre
我不熟悉SystemVerilog,上面的代码是否声明了一个从“typ_one”映射到所有三个存储对象的映射? - Dennis
Dennis,抱歉那是一个错误,我已经修正了SV 3-d阵列的语法。 - Rich
3个回答

1
  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;

1

您的std::map示例将实现您想要的功能。

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


0

至少有两种实现方法。

  • 第一种方法是使用嵌套映射,正如您在问题中建议的那样:映射到所需的嵌套级别的映射或映射等。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接