Как вставить элемент в середину массива.

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
Плутон
новенький
Сообщения: 19
Зарегистрирован: 30.08.2011 09:39:38

Как вставить элемент в середину массива.

Сообщение Плутон »

Здравствуйте! В моей программе есть динамический массив в стиле Delphi. Как вставить в его середину элемент?
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Универсальное решение "в лоб":

1. Добавляете элемент в конец массива.
2. Поштучно сдвигаете элементы с того места, где нужно вставить новый элемент (что-то типа arr[n]:=arr[n-1] ).
3. На освободившееся в середине массива место ставите новый элемент.
Плутон
новенький
Сообщения: 19
Зарегистрирован: 30.08.2011 09:39:38

Сообщение Плутон »

Спасибо!
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Многократно оптимизирванный для больших массивов (код Мартина из MSEGUI):

Код: Выделить всё

procedure insertitem(var dest: integerarty; index: integer; value: integer);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 dest[index]:= value;
end;

procedure insertitem(var dest: realarty; index: integer; value: realty);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 dest[index]:= value;
end;

procedure insertitem(var dest: complexarty; index: integer; value: complexty);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 dest[index]:= value;
end;

procedure insertitem(var dest: pointerarty; index: integer; value: pointer);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 dest[index]:= value;
end;

procedure insertitem(var dest: winidarty; index: integer; value: winidty);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 dest[index]:= value;
end;

procedure insertitem(var dest: stringarty; index: integer; value: string);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 pointer(dest[index]):= nil;
 dest[index]:= value;
end;

procedure insertitem(var dest: msestringarty; index: integer; value: msestring);
begin
 setlength(dest,high(dest) + 2);
 move(dest[index],dest[index+1],(high(dest)-index) * sizeof(dest[0]));
 pointer(dest[index]):= nil;
 dest[index]:= value;
end;
Ответить