Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2010, 04:18   #1
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию Урезать длину списка TList

Есть список TList, в нем 1 000 000 элементов, мне нужно отрезать ему хвост, т.е. удалить последние 700 000 элементов. Можно это сделать одним движением, не вызывая 700 000 раз Delete?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 03.04.2010, 04:56   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Да, можно.
Просто именить свойство List.Count - оно вызывет процедуру SetCount - там всё и "случится" =)
TwiX вне форума Ответить с цитированием
Старый 03.04.2010, 05:36   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
Да, можно.
Просто именить свойство List.Count - оно вызывет процедуру SetCount - там всё и "случится" =)
Код:
procedure TList.SetCount(NewCount: Integer);
var
  I: Integer;
begin
  if (NewCount < 0) or (NewCount > MaxListSize) then
    Error(@SListCountError, NewCount);
  if NewCount > FCapacity then
    SetCapacity(NewCount);
  if NewCount > FCount then
    FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
  else
    for I := FCount - 1 downto NewCount do
      Delete(I); //то что это здесь инкапсулировано, никак не ускоряет процесс :)
  FCount := NewCount;
end;
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 03.04.2010, 10:41   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Если среди нужных элементов нет нулей, можно попробовать pack - обнулить ненужные элементы, pack их уберет (это делается быстро, т.к. блок непрерывный) и изменит count. Останется вызвать SetCapacity для ReallocMem.

Код:
   L1 := TList.Create;
   L1.Count := 10000000;
   for i := 0 to 300000-1 do L1[i] := pointer(i+1);
   L1.Pack;
   L1.Capacity := 300000;
Можно скопировать нужные элементы в другой список - простой вызов move.

Код:
Move(L1.List^, L2.List^, L2.Count*sizeOf(integer));
К сожалению при вызове destructor'а первого списка все-равно вызывается SetCount(0) с вызовом Delete для каждого элемента, поэтому и здесь лучше сначала обнулить элементы и вызвать pack перед удалением списка.
alexBlack вне форума Ответить с цитированием
Старый 03.04.2010, 12:22   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

alexBlack, Спасибо за идеи!
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли урезать еще.... dimorik Общие вопросы C/C++ 10 22.03.2010 07:55
TList->Sort ongleb Общие вопросы C/C++ 0 12.03.2010 14:58
Подкорректирова tList Altera Общие вопросы Delphi 2 11.09.2009 20:24
Сортировка TList prikolist Общие вопросы C/C++ 0 27.04.2009 21:48
Tlist - Сортировка MAcK Компоненты Delphi 1 03.09.2007 15:24