система verilog — Как реализовать многомерный ассоциативный массив в C ++?

Я портирую некоторые 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 > > >;

Так что мои вопросы

(1) является правильным выше в том смысле, что операция в форме mda[x][y][z] вернет то же ожидаемое значение, что и с кодом SV?

(2) есть ли лучший, более чистый способ?

2

Решение

Ваши примеры std :: map будут делать то, что вы хотите.

К сожалению, нет более чистого способа, потому что C ++ не имеет специального синтаксиса для ассоциативных массивов, как это имеет для обычных массивов (и, к сожалению, это примитивные «сырые» массивы, а не объекты массива, как в Java / C #).

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

Есть по крайней мере два подхода к реализации этого.

  • Первый будет использовать вложенные карты, как вы предлагаете себе в своем вопросе: карта карт или карт и т. Д. До желаемого уровня вложенности.

  • Вторым было бы использовать обычную линейную карту, в которой ключ является кортежем индексов (то есть 3 индекса для трехмерного ассоциативного массива).

Я бы на самом деле подумал о следовании второму подходу, если только у вас нет конкретной причины придерживаться первого.

0
По вопросам рекламы [email protected]