2013-09-29 3 views
0

Сегодня у меня есть общий вопрос о хранении объектов/структур или некоторых других значений в многомерном массиве.Многомерный массив в C++?

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

Предположим, у нас есть игра с прокруткой. Теперь мне нужно хранить информацию о ячейках мира в каком-то двумерном массиве, где 0: 0 будет исходной позицией. В начале игры я создаю небольшую область мира, скажем, от -10: -5 до 10: 5. Игрок может перемещаться влево или вправо (а иногда и вверх и вниз), поэтому мне приходится генерировать больше мировой информации, когда он достигает краев мира. Теперь мой вопрос: как я должен хранить двумерный массив с различными экстремумами? Есть ли какие-либо рекомендации относительно того, как это сделать? Что бы вы сделали?

Еще раз спасибо за вашу помощь!

+1

В основном «вектор >». –

+0

@ H2CO3 И как бы я идеально отслеживал размеры? Скажите, что мое поле в одном месте простирается от -101: -18 до 55:12 или что-то в этом роде. Как определить, где хранится информация в ячейке 0: 0? –

+1

с использованием переменной. Тип 'size_t' или' int' или что-то еще. И 'vector' знает его размер. –

ответ

4

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

Затем сохраните эти объекты в более разумной структуре - deque, list или tree в зависимости от того, как их нужно искать.

+0

Прохладный, я раньше не знал о deques, они звучат довольно удобно. Спасибо! –

+0

@LarsEbert, если вы собираетесь двигаться в любом направлении (а не просто прокручивать в 1d), посмотрите на деревья. –

+0

Хорошо, я просто искал «деревья», я не знаю, чего я ожидал ... Но серьезно, я понимаю определение двоичного дерева, но я понятия не имею, как хранить мир в дереве. –

1

Решение №1: используйте массив 1d с size == dimension1*dimension2*dimension3*.... и эмулируйте многомерный массив, подобный этому. Вам нужно будет написать свой собственный код изменения размера (должно быть легко)
Решение №2: Используйте разреженный массив. A std::map<Coordinate, Value> сделаю.
Решение № 3: Boost.MultiArray.
Решение № 4: Не храните мир как N-мерный массив. Храните объекты в виде списка/deque/whatever, затем используйте дерево BSP, oct-деревья, развертку и обрезку или разделение пространства, чтобы быстро находить объекты в видимой области.

Смежные вопросы