Линейный многомерный контейнер - PullRequest
3 голосов
/ 17 апреля 2011

Мне нужен контейнер с линейным вектором, который будет вести себя как контейнер с многомерным вектором.То есть вектор, такой как std::vector< std::vector< std::vector<int> > >, объявляется как std::vector<int>, но ведет себя так, как если бы он был многомерным.Для этого необходимо, чтобы я установил и получил функции, которые разрешают доступ по нескольким индексам, а не по одному (то есть x, y, z, а не только i).

Преобразование не является проблемой (то есть преобразование трехмерного или двумерного индекса в 1D), я уже делаю это.Тем не менее, я начинаю требовать одного и того же преобразования для нескольких массивов.Чтобы усложнить задачу, мне нужно, чтобы линейный массив вел себя так, как если бы он был 2D, 3D и 4D.Теперь я хочу сделать контейнер, который будет заботиться о преобразовании внутри.Для всех намерений и целей, контейнер будет выглядеть как многомерный, но на самом деле это линейный массив снизу.

Итак, во-первых, я не уверен, что в библиотеках вроде boost уже реализовано нечто подобное.Если это так, пожалуйста, укажите мне в правильном направлении.Если нет, то я хотел бы создать его для своего использования, но у меня есть несколько вопросов.

Мой текущий подход заключается в создании класса с векторным контейнером.Есть функция GetVec(), которая будет возвращать адрес std::vector, поэтому мне не нужно писать все функции, которые уже есть у std::vector (получение итераторов, размера и т. Д.).

Я хочу, чтобы пользователь мог использовать контейнер от 1-го до ND.При доступе пользователю должно быть разрешено передавать индексы, которые могут представлять одномерный массив или массив ND.Как убедиться, что пользователь передает правильное количество индексов (в параметрах функции)?Кроме того, при инициализации пользователь должен иметь возможность указать размеры (список переменных параметров?).

Если это вообще плохая идея, пожалуйста, дайте мне знать, но с вескими причинами.Если нет, то любые указания о том, как реализовать этот класс, будут высоко оценены.

1 Ответ

4 голосов
/ 17 апреля 2011

У вас есть два варианта: std::valarray (и его адаптеры для сращивания) или boost::multi_array.

Первому не хватает многих вещей, и он не часто используется (хотя и заслуживает большей любви).Второй - тяжелый, но достаточно чистый для использования.

Кроме того, вы можете взглянуть на Эйгена, если намереваетесь использовать линейную алгебру для этих зверей.

Я также могу упомянуть Intel Array BuildingБлоки, которые просто потрясающие, и может быть, что вы хотите в порядке.Это зависит от того, что вы делаете с этими контейнерами.

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