mrlolthe1st

Vector realization

Nov 29th, 2021
846
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (*
  2.     Реализация
  3.     Конструктив
  4.     Хэши
  5.     ДП
  6.     Графы
  7.     События
  8.     Строки
  9. *)
  10.  
  11. (*
  12.     Capacity = кол-во элементов, которые мы можем сохранить
  13.     Size = кол-во элементов в списке
  14.     xxxxxxxxxxxxxxxx
  15.    
  16. *)
  17. Const
  18.     InitialCapacity = 2;
  19.  
  20. Type
  21.     TElem = LongInt;
  22.     PElem = ^TElem;
  23.    
  24.     TArray = Array Of Telem;
  25.     PArray = ^TArray;
  26.    
  27.     TVector = Record
  28.         Size, Capacity : LongInt;
  29.         Ptr : PArray;
  30.     End;
  31.  
  32. Procedure InitVector(Var V : TVector);
  33. Begin
  34.     V.Size := 0;
  35.     V.Capacity := InitialCapacity;
  36.     GetMem(V.Ptr, SizeOf(TElem) * InitialCapacity);
  37. End;
  38.  
  39. Function Get(Var V : TVector; Pos : LongInt) : PElem;
  40. Var
  41.     Res : Pointer;
  42. Begin
  43.     Res := V.Ptr;
  44.     Inc(Res, Pos * SizeOf(TElem));
  45.     Get := Res;
  46. End;
  47.  
  48. Function Pop(Var V : TVector) : PElem;
  49. Begin
  50.     Dec(V.Size);
  51.     Pop := Get(V, V.Size);
  52. End;
  53.  
  54. Procedure PushBack(Var V : TVector; X : TElem);
  55. Begin
  56.     If V.Size + 1 < V.Capacity Then
  57.     Begin
  58.         Get(V, V.Size)^ := X;
  59.         Inc(V.Size);
  60.     End Else
  61.     Begin
  62.         Inc(V.Capacity, V.Capacity);
  63.         ReAllocMem(V.Ptr, V.Capacity * SizeOf(TElem));
  64.         PushBack(V, X);
  65.     End;
  66. End;
  67.  
  68. Var
  69.     V : TVector;
  70.     I, X : LongInt;
  71. Begin
  72.     InitVector(V);
  73.     Read(I);
  74.     For I := 1 To I Do
  75.     Begin
  76.         Read(X);
  77.         PushBack(V, X);
  78.     End;
  79.     For I := 0 To V.Size - 1 Do
  80.         WriteLn(Get(V, I)^);
  81.     WriteLn('Before pop:');
  82.     WriteLn(V.Capacity, ' ', V.Size);
  83.     While V.Size <> 0 Do Pop(V);
  84.     WriteLn('After pop:');
  85.     WriteLn(V.Capacity, ' ', V.Size);
  86. End.
  87.  
RAW Paste Data