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

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

だから私の質問は、

mda[x][y][z](1) という形式の操作が SV コードと同じ期待値を返すという意味で、上記は正しいですか?

(2)より良い、よりクリーンな方法はありますか?

4

3 に答える 3

1

std :: mapの例は、あなたが望むことをします。

残念ながら、C ++には通常の配列のように連想配列用の特別な構文がないため、よりクリーンな方法はありません(残念ながら、これらはJava / C#のような配列オブジェクトではなく、プリミティブな「生の」配列です)。

于 2012-11-29T15:35:17.803 に答える
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 に答える
0

これを実装するには、少なくとも 2 つのアプローチがあります。

  • 1つ目は、質問で自分自身を示唆しているように、ネストされたマップを使用することです。

  • 2 つ目は、キーがインデックスのタプル (つまり、3D 連想配列の 3 つのインデックス) である通常の線形マップを使用することです。

最初のアプローチに固執する特別な理由がない限り、実際には2番目のアプローチに従うことを検討します.

于 2012-11-29T16:51:58.150 に答える