В чем разница между int [] [] и int [,]?
Возможный дубликат:
В чем разница между использованием int [] [] и int [,]?
Я натолкнулся на это обозначение:
int[,]
Всякий раз, когда мне нужна была матрица, я использовал:
int[][]
В чем разница? Когда использовать какой?
Edit:
Спасибо за быстрые ответы. Я мог подумать об этом. Это также трудно для Google для таких вещей.
Теперь я понимаю цель. Но как они относятся к System.Array?
Ответы
Ответ 1
int[,]
- прямоугольный массив - один объект, который имеет два измерения. Каждый элемент массива является целым числом; все элементы хранятся смежно в памяти.
int[][]
- это зубчатый массив - массив, в котором каждый элемент в свою очередь является int[]
. (Так что это массив массивов.) Хотя каждый элемент массива "верхнего уровня" хранится смежно, эти элементы являются просто ссылками на другие массивы, которые могут быть где угодно в памяти.
В то время как прямоугольные массивы всегда имеют одинаковое количество столбцов на строку, в неровном массиве каждый элемент может иметь разную длину (или действительно может быть нулевым).
У каждого свои преимущества и недостатки; прямоугольные массивы более компактны с точки зрения памяти, но не позволяют разреженной популяции. Жесткие массивы быстрее в CLR, но не имеют такой хорошей когерентности кэш-памяти. Дополнительное пространство, занимаемое "массивами строк" в зубчатых массивах, может быть значительным в некоторых случаях - если у вас есть int[10000, 2]
, который будет занимать только 80000 байт плюс накладные расходы одного объекта массива, тогда как в массиве с зубцами он будет быть 80000 байтами для данных и накладными расходами объектов массива 10001.
MSDN имеет дополнительную информацию в своем руководстве по массивам.
Ответ 2
Первое четное (каждая строка содержит одинаковое количество элементов)
Второй - зубчатый (каждая строка может содержать различное количество элементов)
Другими словами, первый - это многомерный массив - прямоугольный массив. Второй - массив массивов (и, следовательно, каждый отдельный массив может иметь разную длину.)
Ответ 3
int[x,y]
- это двумерный массив с фиксированными размерами (например, int[4,5]
).
int[][]
- это массив с зазубринами, означающий массив массивов, каждый из которых может иметь различное количество элементов.
Ответ 4
Для создания матрицы int[,]
проще. Яркий массив int[][]
требует больше работы (вам нужен дополнительный цикл для настроить полную матрицу).
Но вы все равно можете рассмотреть int[][]
, потому что это быстрее.
Ответ 5
Как и все остальные, int[,]
является многомерным/прямоугольным массивом, а int[][]
- массивом массивов или массивом "зубчатый".
Что касается того, когда вы используете один над другим, int[][]
может быть больно настроено (каждая строка должна быть создана), но, похоже, она всегда будет немного быстрее. Преимущество int[,]
заключается в том, что он проще и регулярность применяется, что делает его отличным, когда вам это нужно. (Труднее случайно заменить целую строку в 2D-массиве, чем может быть с массивом массивов.)