Является ли плохой практикой использование многомерных массивов в C / C ++? - PullRequest
19 голосов
/ 21 апреля 2010

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

Ответы [ 9 ]

12 голосов
/ 21 апреля 2010

Вам нужно хранить многомерные данные там, где вы заранее знаете размеры? Если это так, используйте многомерный массив.

Если вы не знаете размеры заранее (то есть вам придется динамически распределять массив), то вам нужно либо

  • выделяет одномерный массив и эмулирует n-мерный массив, используя индексную арифметику, или
  • выделяет массив указателей на массивы элементов, чтобы получить фактическую семантику многомерного массива

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

4 голосов
/ 21 апреля 2010

Преимущества многослойных матриц для Vector<Vector<>>

  1. Легко набрать [] []
  2. C совместимый.
  3. Просто понять концептуально, что он делает.

Недостатки:

  1. Нет легко обнаруживаемой проверки границ. Ограничение конца внешних скобок обычно переполняется в памяти, выделяемой внутренними скобками, что делает эти типы ошибок реальной болью для отслеживания.
  2. Зубчатые массивы требуют осторожности при настройке. Векторная модель проста.
  3. Многомерные массивы - это более чем двойные указатели, что затрудняет правильное выполнение функций. Большую часть времени я видел, как они просто передали в качестве необработанного адреса двойной указатель, который побеждает внутреннюю математику, которую компилятор сделает для вас.

По сути, это сводится к тому, что мне не хватает проверки границ.

1 голос
/ 07 мая 2012

Существуют следующие преимущества многомерных массивов перед Vector<Vector<>>:

  • Их легко понять.
  • Поиск и сортировка элементов могут быть выполнены очень легко.
  • Они совместимы с C.
  • Их легко набирать.
0 голосов
/ 21 апреля 2010

Я знаю, что все, что можно сделать в многомерный массив также может быть сделано в обычный массив

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

0 голосов
/ 21 апреля 2010

Я могу порекомендовать Boost.MultiArray. Boost.MultiArray предоставляет общее определение концепции N-мерного массива и общие реализации этого интерфейса.

http://www.boost.org/doc/libs/1_42_0/libs/multi_array/doc/index.html

0 голосов
/ 21 апреля 2010

Если вычисление многомерного индекса вызывает ошибки, std::valarray с std::slice является стандартной абстракцией.

0 голосов
/ 21 апреля 2010

Возможно сохранение многомерных данных в одном массиве данных, но вы должны сами следить за индексами. Многомерные массивы на самом деле хранятся в памяти как одномерный массив с синтаксисом для поддержки представления этих данных как многомерных.

Если вы работаете с многомерными данными, то я считаю, что наиболее уместно выбрать правильный инструмент для работы (многомерный массив).

0 голосов
/ 21 апреля 2010

Ну, в C ++ мне не нравятся многомерные массивы, потому что они должны быть заменены на std::vector<std::vector<t> >. Они также особенно важны, если вы хотите представлять std::vector<std::basic_string<t> >.

Многомерные массивы настолько просты, примитив, что меня удивит больше всего. Однако дизайн, использующий одно измерение, вероятно, лучше, чем дизайн, использующий несколько измерений, при прочих равных условиях.

0 голосов
/ 21 апреля 2010

Как бы вы реализовали мой любимый алгоритм без него?

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