![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Двумерный массив
Separator © (2005-11-24 10:27:00)Как проще всего сделать двумерный массив, чтобы потом легко изменять его размеры, удалять и вставлять строки, и столбцы?
Separator (2005-11-24 12:23:00) [1]В общем, сдвигаю move во всех ветках и потом общим SetLength уменьшаю, также при удалении в корне
Separator (2005-11-24 12:20:00) [2]ясно, спасибо
begin...end (2005-11-24 12:17:00) [3]> Separator © (24.11.05 11:59) [15]
Ну, что такое одномерный динамический массив, думаю, понятно. Это указатель на память, в котором последовательно расположены элементы массива. Двумерный динамический массив можно рассматривать как динамический массив, элементами которого являются динамические массивы.
Пример:
var
A: array of array of Integer;
begin
SetLength(A, 2, 5);
end.
Здесь переменная A -- это указатель на память, в которой последовательно расположены две ссылки (указателя) на "внутренние" массивы. В свою очередь, эти ссылки указывают на области памяти, в каждой из которых размещено (непрерывно) по 5 элементов типа Integer. Поэтому, если речь идёт про удаление элемента в пределах одного самого внутреннего массива (например, A[1][2]), то это можно сделать сдвигом:
Move(A[1, 3], A[1, 2], 2 * sizeof(Integer));
SetLength(A[1], Pred(Length(A[1])));
но при этом нет никаких оснований утверждать, что первые 5 Integer-элементов (т.е. тело массива A[0]) находятся по соседству с другими 5 элементами (телом массива A[1]).
Separator (2005-11-24 11:59:00) [4]как такой массив расположен в памяти?
допустим в одномерных массивах при удалении элемента в середине просто с помощью move сдвигал данные "на лево" и конец отсекал SetLength
А тут так можно сделать?
begin...end (2005-11-24 11:52:00) [5]> Separator © (24.11.05 11:51) [13]
Да, в обоих приведённых случаях данные сохранятся.
Separator (2005-11-24 11:51:00) [6]В общем так:
var
M: array of array of Integer;
begin
SetLength(M, 3, 4);
//заполняем, потом хочу увеличить так
SetLength(M, 5, 4);
// Данные сохранятся? А если так?
SetLength(M, 6, 5);
//Массив просто разрастется?
end;
begin...end (2005-11-24 11:34:00) [7]> Separator © (24.11.05 11:29) [11]
Добавление элементов в концы строк (столбцов)? Тогда [8].
Separator (2005-11-24 11:29:00) [8]про удаление знаю что сложно, пока нужно только произвольное наращивание
umbra (2005-11-24 11:22:00) [9]2 begin...end © (24.11.05 11:15) [9]
кто бы сомневался, я не буду :)
просто, как я понял, автор хочет легко удалять и строки, и столбцы, что совсем уж легко не получится никак
begin...end (2005-11-24 11:15:00) [10]> Separator © (24.11.05 10:27)
> легко изменять его размеры, удалять и вставлять строки,
> и столбцы?
Типичные требования, которым удовлетворяет связанный список. В смысле, [4].
> umbra © (24.11.05 11:13) [8]
Двумерный динамический массив.
umbra (2005-11-24 11:13:00) [11]можно сделать массив ссылок на одномерные массивы (строки), они могут быть произвольной длины.
Separator (2005-11-24 11:03:00) [12]Допустим первоначально не известно максимальное количество элементов в строке или в столбце.
Например, я считываю файл с данными и мне нужно паралельно их анализировать и заполнять массив, количество элементов в строке не известно и может быть разным по отношению к разным строкам, но в результате мне нужно получить двумерный массив, а недостающие элементы просто заполнить нулями.
В данном случае одномерный массив не подойдет, просто не удобно будет расширять его.
Separator (2005-11-24 10:51:00) [13]
> umbra © (24.11.05 10:47) [3]
А при изменении размера?
Separator (2005-11-24 10:51:00) [14]
> umbra © (24.11.05 10:47) [3]
А при изменении размера?
Sandman29 (2005-11-24 10:47:00) [15]Список списков.
umbra (2005-11-24 10:47:00) [16]одномерный массив nxm элементов. индексы известны, удалять легко
Separator (2005-11-24 10:43:00) [17]не пойдет, дерево с двумя ветками, это n*2 значений
а мне надо n*m значений
tesseract (2005-11-24 10:34:00) [18]Может дерево с двумя ветками?