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

Я переношу некоторый 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) есть ли лучший и более чистый способ?


person Rich    schedule 29.11.2012    source источник
comment
просмотрите кортежи std::tuple для С++ 11 или boost::tuple в противном случае.   -  person andre    schedule 29.11.2012
comment
Я не знаком с SystemVerilog, объявляет ли приведенное выше сопоставление typ_one всем трем хранимым объектам?   -  person Dennis    schedule 29.11.2012
comment
Денис, извините, это была ошибка, я исправил синтаксис трехмерного массива SV.   -  person Rich    schedule 29.11.2012


Ответы (3)


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

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

person user1610015    schedule 29.11.2012

  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;
person John Bandela    schedule 29.11.2012

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

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

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

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

person AnT    schedule 29.11.2012