2012-11-29 17 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關聯數組)的元組。

我實際上會考慮遵循第二種方法,除非您有特定的理由堅持第一種。

相關問題