我正在将一些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)有更好,更清洁的方式吗?
答案 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个索引)。
我实际上会考虑采用第二种方法,除非你有特别的理由坚持第一种方法。