![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
про динамические массивы
Ezorcist © (2006-07-28 17:08:00)как удалить элемент из динамического массива? Что бы все впередистоящие "сдвинулись, закрыв дыру" :)))
Мефисто (2006-07-28 21:57:00) [1]
> palva © (28.07.06 21:31) [8]
От TList лучше вообще не наследоваться. А создать свой клас, заточенный под свои нужды. TList и так притормаживает из-за не однократных проверок на корректный диапазон индексов в работе своих методов.
> Ezocist (28.07.06 21:23) [6]
TList.Add(Pointer(1));
:= Integer(TList[Index]);
а в Jeer © (28.07.06 17:26) [2]
имелось ввиду: динамические связные списки. Погугли - и найдешь искомое. Так же про эти списки можно инфу найти во многих букварях по дельфи.
palva (2006-07-28 21:54:00) [2]Такой пример
{$APPTYPE CONSOLE}
uses Classes;
var
lst: TList;
bits: TBits;
begin
lst := TList.Create;
bits := TBits.Create;
bits[4] := True;
lst.Add(Pointer(bits));
bits := TBits(lst[0]);
WriteLn(bits[4]); // True
TBits(lst[0]).Free;
lst.Free;
end.
Но корректнее, конечно, написать свой порожденный класс.
@!!ex (2006-07-28 21:32:00) [3]>>И по нему вопрос возник: если в TList все Item : Pointer. Как запихнуть в Item просто TMyClass?
Хм. В Item нельзя запихнуть TMyClass, зато можно запихнуть адрес памяти где находиться экземпляр TMyClass
palva (2006-07-28 21:31:00) [4]Преобразовать объект в Pointer и сохранить в TList. Но по хорошему от Tlist нужно наследовать свой объект, в котором переписать Add Delete Insert Clear и прочие функции (не помню так ли они называются) Эти функции будут вызывать конструкторы а также освобождать объект.
@!!ex (2006-07-28 21:30:00) [5]хм... Если тебе имеет значение порядок элементов то тебе уже сказали.
Если порядок значения не имеет, то есть быстрый способ. Я им всегда пользуюсь.
Ezocist (2006-07-28 21:23:00) [6]2 Мефисто
Спасибо! Только что такое Linked List?
Сейчас нашел просто TList - весьма удобно и просто.
И по нему вопрос возник: если в TList все Item : Pointer. Как запихнуть в Item просто TMyClass?
Мефисто (2006-07-28 19:12:00) [7]
> Ezocist (28.07.06 18:31) [4]
Это я для примера грубо написал. Жестко прописаны циферки (т.к. в уме уже все подсчитанно).
Сначала обясни какие ты элементы хочешь удалять?
Через MoveMemory можно удалить либо один элемент массива, или блок (несколько подряд идущих элементов массива).
Т.е. получается:
индекс элемента: 0, 1, 2, 3
значение элемента: 9, 8, 6, 7
удаляем 8:
MoveMemory(@A[1], @A[2], SizeOf(Integer) * 2 {сколько элеметво осталось в хвосте})
удаляем блок 8, 6:
MoveMemory(@A[1], @A[3], SizeOf(Integer) * 1 {сколько элеметво осталось в хвосте})
Смассивом надо еще будет потрудится т.к. необходимо делать проверки что значания входят в нужный диапазон (индексы элементов). К примеру: в MoveMemory второй параметр этой процедуры. Данный индекс массива должен быть больше индекса массива переданного в первый параметр процедуры и т.д.
Более удобный метод динамического управления списком: Jeer © (28.07.06 17:26) [2]
Ezocist (2006-07-28 18:31:00) [8]2 Мефисто
для I-того элемена будет выглядеть как?
MoveMemory(@A[I-1], @A[I], SizeOf(Integer) * I); &
Мефисто (2006-07-28 17:35:00) [9]var
I: Integer;
A: array of integer;
begin
SetLength(A, 10);
for I := Low(A) to High(A) do
A[I] := Random(50);
MoveMemory(@A[4], @A[5], SizeOf(Integer) * 5);
SetLength(A, 9);
end;
Из массива удаляется 5-й элемент с индексом 4.
А на его место смещаем оставшийся хвост массива из пяти элементов.
И обрезаем длину массива.
Jeer (2006-07-28 17:26:00) [10]Ezorcist (28.07.06 17:08)
> Что бы все впередистоящие "сдвинулись
Плохая мысль.
Изучать структуры данных, "безболезненно" позволяющие такие операции.
Linked List - связанный список.
Мефисто (2006-07-28 17:12:00) [11]Move() + F1 Там есть маленький пример.