Pot șterge un element dintr-o matrice dinamică

Pot șterge un element dintr-o matrice dinamică?

Dar rezultatul copierii nu poate fi atașat la o matrice existentă, ca în cazul în care se creează o matrice nouă începând cu primul element care este copiat :(.

N-am înțeles nimic. Absolut.
Ce este necesar și de ce nu
MyArray [n]: = MyArray [High (MyArray)];
SelLength (MyArray, High (MyArray));
?

Sagrer # xA0; (05/07/05 17:42)

2 Sagrer # xA0; (05/07/05 17:42)
Pe scurt, luați un TList și nu creierul creierului 8)

Uh-uh. dar în ce fel?

Dacă utilizați o atribuire în funcție de element, contorul de referință al penultimului element va fi încă unul (va crește cu atribuirea) și această situație nu apare.

Iată un exemplu simplu care confirmă [3] și [6]:

var
# xA0; A: matrice de șir;

procedura TForm1.Button2Click (expeditor: TObject);
începe
# xA0; ShowMessage (A [8])
end.

Este mai eficient să finalizați mai întâi elementul care trebuie șters (în mod explicit sau indirect), apoi copiați piesa de memorie (decât - alegeți gustul), apoi zero la ultimul element și apoi SetLength.

Și cel care este șters nu trebuie finalizat manual?

> REA # xA0; (06.07.05 10:38) [11]


> Și cel care este șters nu trebuie finalizat manual?

A răspuns la fel în [9]:

> să finalizați mai întâi elementul care trebuie șters (fie explicit, fie implicit);

Și explicați încă, vă rog, de ce să nu folosiți TList în loc de array și să introduceți indicii pentru a stoca numărul de obiecte care se schimbă adesea (obiectele sunt șterse și adăugate).

Cu obiecte mici, TList se dovedește a fi ineficient, deoarece pentru fiecare element este necesar să se aloce memorie, că există un apel suplimentar la managerul de memorie, iar atunci când este multithreaded, acesta include și încuietori.
Producția parțială poate fi un manager de memorie, dar obiectele NewInstance trebuie blocate.

Și am propriile mele rețele pentru această afacere. De fapt, această combinație a unuia și a celuilalt. Vedeți Arrays pe site-ul meu. În același timp, există clase de bază pentru tablouri cu indexare încorporată (căutare rapidă) și sortare, dar acestea nu mai sunt livrate gratuit - dimensiunea elementului matricei crește.

Cu toate acestea, dacă obiectul este, de exemplu, un set de marcaje, cum ar fi marcajele (de exemplu, pentru a stoca înregistrările definite de utilizator din setul de date afișat în rețea) citite din baza de date, atunci este mai ușor să utilizați TList-ul. Cel puțin pentru că vă permite să stocați linkuri către obiecte complexe de containere (de exemplu, înregistrări). Chiar și un număr mare de astfel de "note", IMHO, nu va duce la o încetinire a programului, însă codul este clar și transparent. Și liste de sortare este mai ușor decât arrays (bate, dacă este greșit)

În cazul înregistrării, este mai ușor să nu folosiți TList, deoarece trebuie să alocați în mod explicit fiecare element. Pentru obiecte, puteți automatiza parțial lansarea cu TObjectList.

Să separăm mai întâi muștele de tăițe.
Obiectele și listele TList sunt lucruri foarte diferite. Nu-i spuneți asta, creează confuzie.

Când adăugăm un obiect la obiectul TList, avem:
1. Un apel la GetMem pentru a aloca memorie pentru acest obiect.
2. Este posibil să accesați managerul de memorie din TList-ul însuși, atunci când noua dimensiune

În cazul unei matrice, avem doar al doilea. Dar din păcate (sau din fericire) în Delphi nu există nicio posibilitate de a crea un obiect într-o matrice, toate așa-numitele matrice de obiecte sunt de fapt tablouri de referințe la obiecte. În consecință, aceste tablouri de obiecte nu diferă cu adevărat de TList / TObjectList.
În ceea ce privește accesul la managerul de memorie, practic nu există nici o diferență între tablourile de obiecte și TList / TObjectList. Dar pentru matrice de înregistrări, diferența este semnificativă, deoarece înregistrarea însăși este localizată în matrice. Este un avantaj sau un dezavantaj? Căutați ce. Pentru a șterge, desigur, este mai rău - să copiați mai mult (de obicei). Adăugați același lucru poate fi mai rapid, dar până când depășiți capacitatea, atunci trebuie să copiați din nou mai mult. De asemenea, trebuie să ținem seama că prețul accesului la managerul de memorie este diferit pentru aplicațiile cu un singur filet și cu mai multe filete.

Văzut ochepyatki:
Este posibil să accesați managerul de memorie din TList-ul însuși, atunci când noua dimensiuneEste posibil să accesați managerul de memorie din TList-ul însuși, atunci când noul Dimensiune> Capacitate.

Șters de moderator
Notă: adresați o întrebare în sucursala dvs.

Faceți clic cu Ctrl pe M în M [x], și este într-adevăr că DynArray? Apoi, de asemenea, faceți clic pe DynArray, și este într-adevăr că matricea de întreg? Te uiți la ceva și se va clarifica.

Creați propria temă și puneți-vă întrebarea acolo.

Articole similare