TIntegerList
Модератор: Модераторы
TIntegerList
Сегодня пытался найти класс - список целых чисел, наподобии TList/TStringList/TObjectList. Но:
* Найденные реализации для Delphi наследуются от TList, либо инкапсулируют его, и приводят Integer к Pointer и наоборот, со всеми вытекающими последствиями.
* Есть AcedUtils, где полностью своя реализация, но у неё контейнеры перегружены функциями, завязанными на остальную часть библиотеки, и неизвестная лицензия.
* Есть реализация на основе шаблонов, типа TIntegerList = specialize TFPGList<Integer>, но хотелось бы обойтись без них, возможно ещё придется компилировать на Delphi 7/2006
* Хотелось бы всех возможностей нормальных List'ов, типа предварительного выделения памяти под элементы и дихотомического поиска для отсортированных списков.
Может быть, у кого-нибудь есть на примете (или в работе) такой класс, чтобы не изобретать велосипед?
* Найденные реализации для Delphi наследуются от TList, либо инкапсулируют его, и приводят Integer к Pointer и наоборот, со всеми вытекающими последствиями.
* Есть AcedUtils, где полностью своя реализация, но у неё контейнеры перегружены функциями, завязанными на остальную часть библиотеки, и неизвестная лицензия.
* Есть реализация на основе шаблонов, типа TIntegerList = specialize TFPGList<Integer>, но хотелось бы обойтись без них, возможно ещё придется компилировать на Delphi 7/2006
* Хотелось бы всех возможностей нормальных List'ов, типа предварительного выделения памяти под элементы и дихотомического поиска для отсортированных списков.
Может быть, у кого-нибудь есть на примете (или в работе) такой класс, чтобы не изобретать велосипед?
Odyssey писал(а):Может быть, у кого-нибудь есть на примете (или в работе) такой класс, чтобы не изобретать велосипед?
Код: Выделить всё
TIntegerList = class(TList)
protected
function GetIntValue(aIndex: Integer): Integer;
function SetIntValue(aIndex, aValue: Integer);
public
procedure RemoveInt(aValue: Integer);
procedure AddInt(aValue: Integer);
property IntValue[index: Integer]: Integer read GetIntValue write SetIntValue; default; // хз, позволит ли re-default :)
end;
implementation
{$WARNINGS OFF}{$HINTS OFF}
function TIntegerList.GetIntValue(aIndex: Integer): Integer;
begin
Result:=Integer(Self.Items[aIndex]);
end;
function TIntegerList.SetIntValue(aIndex, aValue: Integer);
begin
Self.Items[aIndex]:=Pointer(aValue);
end;
procedure TIntegerList.RemoveInt(aValue: Integer);
begin
Remove(Pointer(aValue));
end;
procedure TIntegerList.AddInt(aValue: Integer);
begin
Add(Pointer(aValue));
end;
Ну нахера вам листы для списка целых чисел?!!!!!! (извините, не удержался) 
Используйте уже динамические массивы и отстаньте! А сортировку и "сериализацию" для целых чисел делать.... оооооо!!!! Это вообще улет.
Используйте уже динамические массивы и отстаньте! А сортировку и "сериализацию" для целых чисел делать.... оооооо!!!! Это вообще улет.
скалогрыз
Вот-вот, именно такой код я и находил
А как же
? Что будет при компиляции под платформы, где Integer и Pointer имеют разный размер?
Timid
Листы мне нужны чтобы вместо
и других трудночитаемых вещей писать
Например, сколько операций с массивами нужно сделать, чтобы получить такой же результат как тут:
Если вы не используете эти возможности -- никаких проблем, пишите на массивах
Мне эти возможности нужны, а код потом придётся читать, и не мне одному.
Вот-вот, именно такой код я и находил
Hint: Conversion between ordinals and pointers is not portable
? Что будет при компиляции под платформы, где Integer и Pointer имеют разный размер?
Timid
Листы мне нужны чтобы вместо
Код: Выделить всё
System.Move (MyList[Index+1], MyList[Index], (FCount - Index) * SizeOf(Integer));и других трудночитаемых вещей писать
Код: Выделить всё
MyList.Delete(Index);Например, сколько операций с массивами нужно сделать, чтобы получить такой же результат как тут:
Код: Выделить всё
MyListA.Assign(MyListB, laAnd, MyListC)Если вы не используете эти возможности -- никаких проблем, пишите на массивах
А библиотечку функций написать?
Инкапсуляция ведь тебе не нужна, равно как и абстрации. Значит ООП для твоего случая - перебор.
Инкапсуляция ведь тебе не нужна, равно как и абстрации. Значит ООП для твоего случая - перебор.
С библитечкой, конечно, лучше чем без неё. И тем не менее, мне нужно предварительное выделение памяти, т.е. размер массива будет не равен числу реально занятых элементов в нём. Вот тут и пригодится инкапсуляция, а с массивами придётся добавлять по переменной на каждый экземпляр массива, и таскать их вместе с массивами в функции.
специально написал {$WARNINGS OFF} и {$HINTS OFF}
ничего, кроме тех платформ, где sizeof(pointer)<sizeof(Integer)
про готовые классы не знаю, но на ум приходить, что-то вроде:
ЗЫ: Соглашусь с Timid-ом, в том, что Integer "слишком простой и слишком базовый" тип данных, чтобы для него писать спец-класс обёртку. Хотя ничего предосудительного (или неправильного) в этом нет. Но может быть, для решения задачи, есть более "высокоуровневые" типы данных, для которых лучше писать обёртки?!
Odyssey писал(а):? Что будет при компиляции под платформы, где Integer и Pointer имеют разный размер?
ничего, кроме тех платформ, где sizeof(pointer)<sizeof(Integer)
про готовые классы не знаю, но на ум приходить, что-то вроде:
Код: Выделить всё
type
TIntegerList = class
private
fcount : Integer;
public
data : array of Integer;
procedure Assign(list: TIntegerList);
procedure MoveFrom(list: TIntegerList; InsertPos, SourcePos, Count: Integer);
procedure AddFrom(list: TIntegerList; InsertPos, SourcePos, Count: Integer);
procedure Insert(FisrtIndex: Integer; const Values: array of Integer);
procedure Delete(const Indexes: array of Integer);
procedure MegaSort;
procedure SuperSort;
procedure SuperMegaSort;
function SuperPooperFastSearch(value: Integer): Integer;
property Count: Integer read fCount;
end;
implementation
... собственно весь код уже написан, его нужно только перенести в класс..
ЗЫ: Соглашусь с Timid-ом, в том, что Integer "слишком простой и слишком базовый" тип данных, чтобы для него писать спец-класс обёртку. Хотя ничего предосудительного (или неправильного) в этом нет. Но может быть, для решения задачи, есть более "высокоуровневые" типы данных, для которых лучше писать обёртки?!
скалогрыз писал(а):про готовые классы не знаю, но на ум приходить, что-то вроде:
...
... собственно весь код уже написан, его нужно только перенести в класс..
Да, именно так и сделал. Если кому-нибудь интересно, модуль прилагаю.
скалогрыз писал(а):... может быть, для решения задачи, есть более "высокоуровневые" типы данных, для которых лучше писать обёртки?!
В моём случае нужно хранить множество индексов "использованных" объектов из другого списка, чтобы обеспечить неповторяющийся случайный выбор этих объектов. Тут использовать что-то более высокоуровневое, имхо, нет смысла.
Vadim писал(а):В GLScene есть класс - TIntegerList.
О, спасибо, его я не находил. Правда сейчас уже скопипастил то, что было нужно из RTL, но в GLScene довольно хорошая коллекция типов, возьму её на заметку.
Вобщем, всем спасибо, проблема решена. Прилагаю модуль IntegerList.pas. При необходимости, на его основе несложно сделать TInt64List, TDoubleList, TBooleanList и т.д. с помощью встроенного в Lazarus IDE движка шаблонов под названием SyncronEdit
У вас нет необходимых прав для просмотра вложений в этом сообщении.
В модуле IntegerList.pas ошибки, там где SizeOf(Pointer) придется исправить, если TLargeIntListItem сделаете не Integer
