Вложенный словарь / массив в C ++ - PullRequest
6 голосов
/ 03 марта 2011

Все, я парень из Python / C # и пытаюсь выучить C ++.В Python я использовал такие вещи, как:
myRoutes = {0:[1,2,3], 1:[[1,2],[3,4]], 2:[[1,2,3],[[1,2,3],[1,2,3]],[4]]}

В основном, когда у вас есть массивы переменной длины, и вы не хотите тратить на них двумерную матрицу, вложив массивы в словарь, чтобы сохранитьотслеживать их - хороший вариант.

В C ++ я пробовал std::map<int, std:map<int, std:map<int, int> > >, и это работает, но я чувствую, что есть лучший способ сделать это.

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

Я ценю вашу помощь,
Али

Ответы [ 2 ]

5 голосов
/ 03 марта 2011

Похоже, что часть вопроса такова: «Как хранить неоднородные данные в контейнере?» Есть несколько разных подходов:

1) Используйте готовый класс типов массивов, который абстрагирует точные детали (то есть, размерность). Пример: Повышение базовой линейной алгебры

2) Составьте точный список типов элементов, используя Boost.variant

   #import "boost/variant.hpp"

   typedef boost::variant< ArrayTypeA, ArrayTypeB > mapelement;
   typedef std::map<int, mapelement> mappingtype;

Построение посетителя для типа variant немного сложное (оно включает в себя написание подкласса boost::static_visitor<desired_return_type> с одной перегрузкой operator() для каждого типа в вашем варианте). С другой стороны, посетители статически проверяются на тип, чтобы убедиться, что они реализуют точный правильный набор обработчиков.

3) Используйте тип обертки, например Boost.Any, чтобы обернуть различные типы интереса.


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

2 голосов
/ 03 марта 2011

Многие из нас разделяют боль, которую вы испытываете сейчас, но есть решения для них. Одним из таких решений является библиотека Boost (она похожа на 2-ую стандартную библиотеку C ++.) Существует довольно много коллекционных библиотек. В вашем случае я бы использовал Boost :: Многомерные массивы .

выглядит так:

boost::multi_array<double,3> myArray(boost::extents[2][2][2]);

, который создает массив 2x2x2. Первый тип в параметрах шаблона «double» указывает, какой тип будет содержать массив, а второй «3» - количество измерений массива. Затем вы используете «экстенты», чтобы передать фактический размер каждого из измерений. Довольно прост в использовании и синтетически ясен в своих намерениях.

Теперь, если вы имеете дело с чем-то в Python, таким как foo = {0:[1,2,3], 1:[3,4,5]}, то, что вы действительно ищете, это multimap . Это является частью стандартной библиотеки и представляет собой красно-черное дерево, индексируемое по ключу, но со списком для значения.

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