Alternative in FPC zu c++ Vector

Rund um die LCL und andere Komponenten
Antworten
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Alternative in FPC zu c++ Vector

Beitrag von hubblec4 »

Hi

Ich würde gerne mal wissen ob es da etwas ähnliches in FPC/Lazarus gibt.

Das tolle an diesen "Vectoren" ist das es wie ein array funktioniert aber dennoch sowas wie Delete[index] hat. Desweiteren reicht so ein Array für mein Vorhaben, da nichts wildes drin gespeichert werden soll.

Ein Record zum Beispiel, denn so ein Record lässt sich sehr schlecht in eine List einpflegen, da die immer ein TObject haben wollen. Ausserdem muss dann auch immer erst das Object erzeugt/zerstört werden.
Zuletzt geändert von hubblec4 am Di 10. Aug 2021, 19:15, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Alternative in FPC zu c++ Vector

Beitrag von Socke »

Was spricht gegen eine spezialisierte Liste?

Code: Alles auswählen

program Project1;

{$mode objfpc}{$H+}
{$ModeSwitch advancedrecords}

uses
 fgl;

type
  { TMyRecord }
  TMyRecord = record
    field1: Integer;
    class operator =(const r1, r2: TMyRecord): boolean;
  end;
  TMyVector = specialize TFPGList<TMyRecord>;

{ TMyRecord }

class operator TMyRecord. = (const r1, r2: TMyRecord): boolean;
begin
  Result := r1.field1 = r2.field1;
end;

var
  list: TMyVector;
  r: TMyRecord;
begin
  list := TMyVector.Create;
  list.Add(r);
  list.Delete(0);
  list.Destroy;
end.
Damit TFPGList mit einen Record-Typen spezialisiert werden kann, muss dieser einen Vergleichsoperator mitbringen. Dies funktioniert wie im Beispiel nur mit dem Modeswitch advancedrecords; der Operator muss dann als Teil des Record-Typen definiert sein.

Man könnte die Syntax der Vektoren mit Typehelpern abbilden; diese müssen nach meinem Wissen aber für jeden Array-Typen neu definiert werden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Alternative in FPC zu c++ Vector

Beitrag von hubblec4 »

Hi Socke.

Danke für die Info.

Also das eine FPGList einen Record aufnehmen kann wusste ich nicht, und das dieser Record noch einen Vergleichsoperator braucht, darauf wäre ich nie gekommen.

Aufjedenfall klingt es interessant und ich werde es ausprobieren.

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Alternative in FPC zu c++ Vector

Beitrag von PascalDragon »

hubblec4 hat geschrieben:
Di 10. Aug 2021, 17:46
Also das eine FPGList einen Record aufnehmen kann wusste ich nicht, und das dieser Record noch einen Vergleichsoperator braucht, darauf wäre ich nie gekommen.
TFPGList<> ist ein generischer Typ und solange der Typ mit dem dieser generischer Typ spezialisiert wird eben einen Vergleichsoperator mitbringt, gelingt diese Spezialisierung.

Alternativ kannst du seit FPC 3.2.0 auch den generischen TList<> Typ aus Generics.Collections verwenden, der braucht keinen Vergleichsoperator (falls man jedoch spezielle Bedingungen an den Vergleich hat, kann man einen entsprechenden IComparer<> verwenden).
FPC Compiler Entwickler

Antworten