Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

  • Легко печатать [] []
  • C совместим.
  • Просто понять концептуально, что он делает.

Недостатки:

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

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

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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