Страница 1 из 1

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

СообщениеДобавлено: 31.12.2011 09:12:01
Плутон
Здравствуйте! В моей программе есть динамический массив в стиле Delphi. Как вставить в его середину элемент?

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

СообщениеДобавлено: 31.12.2011 10:18:36
Nik
Универсальное решение "в лоб":

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

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

СообщениеДобавлено: 31.12.2011 10:54:44
Плутон
Спасибо!

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

СообщениеДобавлено: 01.01.2012 20:03:36
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;