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

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

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

4

3 回答 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;
于 2012-11-29T16:19:55.183 回答
1

您的 std::map 示例将执行您想要的操作。

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

于 2012-11-29T15:35:17.803 回答
0

至少有两种方法可以实现它。

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

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

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

于 2012-11-29T16:51:58.150 回答