Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

У можно как-то у TList'a сделать эффектное массовое удаление? [D7, WinXP]


Страницы:   1 2

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]

Похоже, что выбрана неверная структура данных. Поподробнее о задаче можно?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо