2012-11-29 57 views
2

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

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

我知道与1-d关联数组我可以用一张地图,并与2-d阵列的嵌套地图,我相信类似的方法可以解决多维数组,但它变得非常混乱。

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

考虑的元组'的std :: tuple'为C++ 11或'提振:: tuple'否则。 – andre

+0

我对SystemVerilog不熟悉,上面是否向所有三个存储对象声明了一个“typ_one”映射? – Dennis

+0

丹尼斯,对不起,这是一个错误,我修正了SV 3-d数组的语法 – Rich

回答

1

你的std :: map例子会做你想做的。

不幸的是,没有更清晰的方法,因为C++没有特别的关联数组语法,就像正常数组一样(不幸的是那些是原始“原始”数组,而不是Java/C#中的数组对象)。

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

至少有两种方法来实现这一点。

  • 第一个将使用嵌套地图,如你在你的问题中建议你自己:地图或地图等到所需的嵌套层次。

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

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