Некоторые программисты, кажется, яростно ненавидят их, в то время как другие, кажется, думают, что они в порядке. Я знаю, что что-либо, что может быть сделано к многомерному массиву, может также быть сделано к эквидистантной антенной решетке, таким образом, они функционально эквивалентны. Это - плохая практика для использования многомерных массивов, или разве это не имеет значения?
Вам нужно хранить многомерные данные, где вы заранее знаете размеры? Если да, используйте многомерный массив.
Если вы заранее не знаете размеры (т. Е. Вам придется динамически выделять массив), то вам нужно либо
Это зависит от конкретного варианта использования, но, как правило, я почти всегда предпочитаю первое, потому что это сокращает количество проблем с управлением памятью и меньшее количество выделений кучи. Сложность для обоих подходов растет с увеличением количества измерений, но, на мой взгляд, она растет намного быстрее для последнего подхода из-за дополнительных уровней косвенности.
Я могу порекомендовать Boost.MultiArray. Boost.MultiArray предоставляет определение общей концепции N-мерного массива и общие реализации этого интерфейса.
http://www.boost.org/doc/libs/1_42_0/libs/multi_array/doc/index.html
Как бы вы реализовали мой любимый алгоритм без него?
Ну, в C ++ мне не нравятся многомерные массивы, потому что они должны быть заменены с std :: vector
. Они также особенно важны, если вы хотите представить std :: vector
.
Многомерные массивы настолько просты и примитивны, что я удивлен, что большинству это будет интересно. Однако дизайн, в котором используется одно измерение, вероятно, лучше, чем дизайн с несколькими измерениями при прочих равных условиях.
Преимущества многомерных массивов перед Vector
Недостатки:
В основном, это сводится к тому, что для меня не проверяются границы.
Я знаю, что все, что можно сделать с многомерным массивом, можно также сделать с обычным массивом
Я не думаю, что это совсем верно. Нам понадобится массив указателей для хранения чего-то столь же простого, как список имен, а затем его сортировка. Или указатели на указатели для хранения строки переменной длины, а затем список таких строк. Поскольку в исходных вопросах упоминаются только массивы как таковые, не видно, как подобные проблемы могут быть решены с такой же легкостью в обычном массиве. Пожалуйста, подумайте не только о хранении строк в одномерном массиве (возможно, используя какой-то разделитель), но также о выполнении таких операций, как сортировка.
Возможно, можно хранить многомерные данные в массиве с отдельными данными, но вам придется самостоятельно отслеживать индексы. Многомерные массивы фактически хранятся в памяти как одномерные массивы с синтаксисом для поддержки представления этих данных как многомерных.
Если вы работаете с многомерными данными, я считаю, что наиболее целесообразно выбрать правильный инструмент для работы (многомерный массив).
Если вычисление многомерного индекса вызывает у вас ошибку, std :: valarray
с std :: slice
является стандартной абстракцией. .