Это - плохая практика для использования многомерных массивов в C/C++?

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

19
задан Maulrus 21 April 2010 в 02:01
поделиться

8 ответов

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

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

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

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

12
ответ дан 30 November 2019 в 05:01
поделиться

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

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

0
ответ дан 30 November 2019 в 05:01
поделиться

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

0
ответ дан 30 November 2019 в 05:01
поделиться

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

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

0
ответ дан 30 November 2019 в 05:01
поделиться

Преимущества многомерных массивов перед Vector >

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

Недостатки:

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

В основном, это сводится к тому, что для меня не проверяются границы.

4
ответ дан 30 November 2019 в 05:01
поделиться

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

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

0
ответ дан 30 November 2019 в 05:01
поделиться

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

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

0
ответ дан 30 November 2019 в 05:01
поделиться

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

0
ответ дан 30 November 2019 в 05:01
поделиться