Có lẽ tương tự Delphi gần nhất với std::vector<T>
là TList<T>
. Bạn có thể duyệt qua danh sách với một vòng lặp for in
:
var
Item: Integer;
List: TList<Integer>;
....
for Item in List do
Writeln(Item);
Nếu bạn có một mảng động chứ không phải là một TList<T>
sau đó bạn có thể sử dụng for in
để lặp qua các yếu tố. Trên thực tế, tất cả các thùng chứa được tích hợp đều hỗ trợ for in
và thật dễ dàng để thêm hỗ trợ cho for in
vào các lớp học của riêng bạn.
Trong C++ không có gì giống như vòng lặp for in
và do đó thành ngữ là sử dụng thuật toán STL. Đó là những gì khiến bạn sử dụng một hàm ẩn danh. Trong Delphi với cú pháp for in
, bạn có thể diễn tả "lặp lại tất cả các thành viên của vùng chứa" theo cách tự nhiên mà không cần dùng đến các phương thức nặc danh.
Generics được thêm vào Delphi tại Delphi 2009 và vòng lặp for in
đã được thêm vào Delphi 2005, vì vậy tất cả điều này có sẵn cho bạn trong XE. Đối với những gì nó có giá trị, vô danh cũng đã được thêm vào trong Delphi 2009.
Những gì bạn phải nhận ra là các generics Delphi ít mạnh hơn các mẫu C++. Mặc dù bạn nói về một số chung là foreach
, mã của bạn không phải là chung chung theo nghĩa là mã đó có chuyên ngành int
. Bạn có thể viết một phiên bản chung của mã của bạn trong C + + nhưng điều này sẽ khó khăn hơn nhiều để làm với Generics Delphi do những hạn chế vốn có của generics khi so sánh với các mẫu. Một nỗ lực để viết mã trên một cách chung chung trong Delphi sẽ sáng lập tại thời điểm mà bạn đã cố gắng gọi Writeln
. Trong khi đó sẽ là tầm thường với các mẫu C++ nó là bực bội ngoài tầm với cho Generics.
Cập nhật: Trong các nhận xét bạn hỏi nếu có cách khéo léo để thêm nội dung của vùng chứa này vào vùng chứa khác. Phương thức AddRange
thực hiện điều đó. TList<T>.AddRange()
có ba biến thể quá tải nhận một trong các thông số đầu vào sau: array of T
, Collection: IEnumerable<T>
hoặc Collection: TEnumerable<T>
. Tất cả các thùng chứa chung tiêu chuẩn đều theo một mẫu tương tự.
Nguồn
2012-03-09 18:27:59
Đó là cách tôi đã thực hiện: đối với i: = 0 đến n - 1 do result.Add (i); Nhưng tôi đã tự hỏi cho dù chức năng chung như vậy tồn tại :) – Mihaela
Cú pháp Lambda/Closure/Anonfunction là CLUNKY trong delphi mà nó là khá lớn mà bạn không cần nó cho 'for' vòng. Thành ngữ C++ như thường lệ, không dịch tốt sang pascal. Nhưng C# và Delphi là khá gần thực sự. –
Tôi thấy nó khá hữu ích trong C++. Không chỉ là trình dọn dẹp mã (đối với các hàm ẩn danh nhỏ), nhưng trong C++ nó thường được nội tuyến và tạo mã nhanh hơn. – Mihaela