![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
У можно как-то у TList'a сделать эффектное массовое удаление? [D7, WinXP]
Aleksandr. © (2004-08-11 17:43:00)Тут у меня потомок TList работает, так вот при наборе в 500000 элементов удаляет он их достаточно медленно, если вызывать List.Delete(0). Смотрел я долго на всякие мувы, которые у него внутри происходят, но чего-то так ничего и не выцепил, как можно было бы одним обращением задать ему на удаление элементов так с тысячу:
procedure TList.Delete(Index: Integer);
var
Temp: Pointer;
begin
if (Index < 0) or (Index >= FCount) then
Error(@SListIndexError, Index);
Temp := Items[Index];
Dec(FCount);
if Index < FCount then
System.Move(FList^[Index + 1], FList^[Index],
(FCount - Index) * SizeOf(Pointer));
if Temp <> nil then
Notify(Temp, lnDeleted);
end;
VMcL (2004-08-11 18:06:00) [21]>> Aleksandr. (11.08.04 17:43)
Удалять в порядке Count - 1 downto 0 пробовал?
Мастер (2004-08-11 18:04:00) [22]Что-то такое примерно:
procedure TList.DeleteItems(Index1,Index2: Integer);
//var
// Temp: Pointer;
begin
if (Index1>Index2) or (Index1 < 0) or (Index2 >= FCount) then
Error(@SListIndexError, Index);
// Temp := Items[Index];
Dec(FCount,Index2-Index1+1);
if Index2 < FCount then
System.Move(FList^[Index1 + 1], FList^[Index1],
(FCount - Index2) * SizeOf(Pointer));
// if Temp <> nil then
// Notify(Temp, lnDeleted);
end;
Если необходимо, то можно переопределить TList.Notify
Aleksandr. (2004-08-11 17:59:00) [23]Ну, метод я добавил, но как его реализовать? Как массовый сдвиг сделать?
Aleksandr. (2004-08-11 17:58:00) [24]Нет, потому что удаляются не все элементы.
Sandman25 (2004-08-11 17:58:00) [25]Напишите своего наследника TList, добавьте метод DeleteItems(FirstIndex, Count)
Sandman25 (2004-08-11 17:55:00) [26][4] Aleksandr. (11.08.04 17:53)
После такого:
Причем тут структура
остается только спросить: "List.Clear не подойдет?"
Aleksandr. (2004-08-11 17:53:00) [27]Задача - превратить цикл
System.Move(FList^[Index + 1], FList^[Index],
(FCount - Index) * SizeOf(Pointer));
в какое-то одно действие. Причем тут структура - освобождение тех же пятисот тысяч итемов перед удалением делается моментально. А вот на удалении тормоза.
Ega23 (2004-08-11 17:52:00) [28]Можно только посоветовать свой список создать.
Например: каждый элемент хранить в структуре "указатель на объект" + "указатель на следующий элемент".
При удалении k-го элемента "указатель на следующий элемент" в (k-1)-м элементе перенаправлять на (k+1)-й элемент.
Правда тогда поледний элемент будет долго удалять :о)
MacroDenS (2004-08-11 17:47:00) [29]удаление процесс обратный добавлению!
Добавляешь построчно - удаляешь построчно...
Sandman25 (2004-08-11 17:46:00) [30]Похоже, что выбрана неверная структура данных. Поподробнее о задаче можно?