Есть ли HashSet в Delphi?
Я знаю, что использование set can может содержать 255 элементов. Есть ли HashSet в последнем компиляторе Delphi, например. XE8, Сиэтл
Есть ли HashSet в Delphi?
Я знаю, что использование set can может содержать 255 элементов. Есть ли HashSet в последнем компиляторе Delphi, например. XE8, Сиэтл
Стандартные коллекции не предлагают общий набор классов. Библиотеки сторонних коллекций, такие как Spring4D, делают.
Вы можете легко создать общий набор классов поверх TDictionary<K, V>. Версия с голыми костями может выглядеть так:
type
TSet<T> = class
private
FDict: TDictionary<T, Integer>;
public
constructor Create;
destructor Destroy; override;
function Contains(const Value: T): Boolean;
procedure Include(const Value: T);
procedure Exclude(const Value: T);
end;
....
constructor TSet<T>.Create;
begin
inherited;
FDict := TDictionary<T, Integer>.Create;
end;
destructor TSet<T>.Destroy;
begin
FDict.Free;
inherited;
end;
function TSet<T>.Contains(const Value: T): Boolean;
begin
Result := FDict.ContainsKey(Value);
end;
procedure TSet<T>.Include(const Value: T);
begin
FDict.AddOrSetValue(Value, 0);
end;
procedure TSet<T>.Exclude(const Value: T);
begin
FDict.Remove(Value);
end;
Я не компилировал этот код, поэтому вам, возможно, придется исправить любые ошибки, которые я сделал. Вы, скорее всего, захотите расширить его, чтобы быть более способным. Но, надеюсь, это может показать вам, как начать.
Вы можете использовать TDictionary. Определите параметр типа TKey, который вы хотите отслеживать. Параметр TValue может быть любым; вы не будете использовать его. (Perl также не имеет заданного типа, и поэтому соглашение должно использовать его хэш-тип таким же образом, как я предлагаю здесь.)
Вызовите ContainsKey, чтобы проверить членство. Используйте Add или AddOrSetValue для вставки; Remove для удаления.
Было бы тривиальным упражнением написать оболочку, которая скрывает неиспользуемый параметр TValue.