Prawdopodobnie najbliższym analogiem Delphi do std::vector<T>
jest TList<T>
. Można iteracyjne nad listy z for in
pętli:
var
Item: Integer;
List: TList<Integer>;
....
for Item in List do
Writeln(Item);
Jeśli masz dynamicznej tablicy zamiast TList<T>
następnie można użyć for in
iteracyjne nad elementów. W rzeczywistości wszystkie wbudowane pojemniki obsługują for in
i łatwo jest dodać obsługę for in
do własnych klas.
W C++ nie ma nic takiego jak pętla for in
, a więc idiomem jest użycie algorytmu STL. To właśnie powoduje, że używasz anonimowej funkcji. W Delphi ze składnią for in
można wyrazić "iterację wszystkich elementów kontenera" w sposób naturalny bez odwoływania się do metod anonimowych.
Generics zostały dodane do Delphi w Delphi 2009, a pętla for in
została dodana w Delphi 2005, więc wszystko to jest dostępne w XE. Warto dodać, że w Delphi 2009 dodano także anonim.
Należy zdać sobie sprawę z tego, że generics Delphi ma mniejszą moc niż szablony C++. Chociaż mówisz o generycznym foreach
, twój kod nie jest generyczny w tym sensie, że wyspecjalizował się w int
. Możesz napisać ogólną wersję swojego kodu w C++, ale byłoby to znacznie trudniejsze w przypadku generycznych elementów Delphi ze względu na nieodłączne ograniczenia generycznych w porównaniu do szablonów. Próba napisania powyższego kodu w sposób ogólny w Delphi byłaby założeniem w miejscu, w którym próbowałeś zadzwonić pod numer Writeln
. Chociaż byłoby to trywialne w przypadku szablonów C++, jest to frustrująco niedostępne dla generycznych.
Aktualizacja: W komentarzach pytasz, czy istnieje łatwa metoda dodawania zawartości jednego kontenera do drugiego. Jest to zrobione za pomocą metody AddRange
. TList<T>.AddRange()
ma trzy przeciążone warianty, które otrzymują jeden z następujących parametrów wejściowych: array of T
, Collection: IEnumerable<T>
lub Collection: TEnumerable<T>
. Wszystkie standardowe standardowe pojemniki mają podobny wzór.
Tak to zrobiłem: dla i: = 0 do n - 1 do wyniku. Dodaj (i); Ale zastanawiałem się, czy taka ogólna funkcja istnieje :) – Mihaela
Składnia Lambda/Closure/Anonfunction jest tak CLUNKY w delphi, że jest całkiem niezłe, że nie potrzebujesz go do pętli 'for'. Idiomy C++ jak zwykle nie tłumaczą się dobrze na paskal. Ale C# i Delphi są całkiem blisko. –
Uważam, że jest całkiem przydatne w C++. Nie tylko jest to czystszy kod (w przypadku małych funkcji anonimowych), ale w C++ często jest wprowadzany i generuje szybszy kod. – Mihaela