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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2014, 10:35   #1
spectrum988
Форумчанин
 
Аватар для spectrum988
 
Регистрация: 24.10.2013
Сообщений: 241
По умолчанию Работа с динамическими массивами

Доброго времени суток.Скажите пожалуйста как удалить из динамического массива конкретный элемент(например все четные) ?
spectrum988 вне форума Ответить с цитированием
Старый 26.09.2014, 10:40   #2
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

А книжки ты по какой причине не хочешь читать?
indexx вне форума Ответить с цитированием
Старый 26.09.2014, 11:06   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как удалить из динамического массива конкретный элемент(например все четные) ?
Только переписав в новый массив.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2014, 11:10   #4
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

Странно. Я думал, можно обойтись простым сдвигом, и изменением длины массива
indexx вне форума Ответить с цитированием
Старый 26.09.2014, 11:23   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и изменением длины массива
Можно и так. Я предпочитаю пересоздавать массив.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2014, 11:55   #6
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

Для задачи удаления выгодней использовать второй динамический массив для скорости. Поясню, вы просматриваете первый массив и если элемент соответствует условиям, вы его переносите во второй массив.

В противном случае, вам необходимо будет запоминать позицию сдвига и копировать (затирать) ненужные элементы на подходящие, а потом обрезать массив. Возможно я не прав.
Simply-Art вне форума Ответить с цитированием
Старый 26.09.2014, 12:05   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Возможно я не прав.
Что то, что то по скорости будет одинаково, если при переносе с места на место не проводить перенос последующих элементов сразу, а просто запоминать позицию куда перенесено. Я тут неоднократно давал алгоритм шринковки массива. Там два индекса: Элемент, который сравнивается и элемент куда переносится. Если сравниваемый не отвечает условию удаления оба индекса инкрементируются. Иначе второй индекс не меняется. Таким образом и проверка и перенос идет в одном цикле. А потом переобразмеривание массива либо урежет либо пересоздаст в новое место его. Тут уж я не знаю как менеджер памяти Делфи нонче работает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2014, 12:12   #8
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

Не будет это по скорости одинаково, так как в предложенном мной варианте не происходит ни каких действий с элементами стоящими до удаляемого элемента.
indexx вне форума Ответить с цитированием
Старый 26.09.2014, 12:19   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
так как в предложенном мной варианте не происходит ни каких действий с элементами стоящими до удаляемого элемента.
Ты не учел задание:
Цитата:
например все четные
Соответственно у тебя нет номера удаляемого элемента.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2014, 13:38   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Короче...
Код:
type
  TVector = array of Integer;
  
// удаление чётных из динмассива
function DeleteEven(const Source: TVector): TVector;
var
  Len, Index, Count: Integer;
begin
  Len:= Length(Source);
  SetLength(Result, Len);
  Count:= 0;
  
  for Index:= 0 to Len - 1 do
    if Odd(Source[Index])
      then begin
             Result[Count]:= Source[Index];
             Inc(Count);
           end;
           
  SetLength(Result, Count);
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с динамическими массивами Heng Помощь студентам 1 08.10.2013 21:18
Lazarus (Работа с динамическими массивами) Dionis46 Lazarus, Free Pascal, CodeTyphon 2 15.02.2012 21:26
Работа с динамическими массивами типа record Олвин Общие вопросы Delphi 8 14.07.2011 01:13