おそらくstd::vector<T>
に最も近いデルファイ類似体はTList<T>
です。あなたが動的配列ではなくTList<T>
を持っているなら、あなたは、要素を反復するfor in
を使用することができます
var
Item: Integer;
List: TList<Integer>;
....
for Item in List do
Writeln(Item);
:あなたはfor in
ループでリストを反復処理することができます。実際、すべての組み込みコンテナはfor in
をサポートしており、for in
のサポートを自分のクラスに追加するのは簡単です。
C++では、for in
ループのようなものはないので、イディオムはSTLアルゴリズムを使用することです。それが匿名機能を使用することにつながります。 for in
構文のDelphiでは、匿名メソッドに頼ることなく、自然な方法で「コンテナのすべてのメンバーを繰り返し処理する」ことができます。
ジェネリックはDelphi 2009でDelphiに追加され、for in
ループはDelphi 2005で追加されたので、これはすべてXEで利用できます。それは価値があるため、Delphi 2009でも匿名性が追加されました。
DelphiのジェネリックスはC++のテンプレートよりも強力ではありません。一般的なforeach
について言及していますが、コードはint
に特化しているという意味では一般的ではありません。あなたはC++でコードのジェネリックバージョンを書くことができますが、テンプレートと比べてジェネリックの固有の制限のためにDelphiのジェネリックスとはるかに難しいでしょう。 Delphiで一般的な方法で上記のコードを書き込もうとすると、Writeln
を呼び出そうとした時点で創始者となります。 C++のテンプレートではそれほど簡単ではありませんが、ジェネリックのために手間がかかりません。
更新:コメントには、コンテナの内容を別のコンテナに追加するための滑らかな方法があるかどうかを尋ねるメッセージが表示されます。 AddRange
メソッドがそれを行います。 TList<T>.AddRange()
には、array of T
,Collection: IEnumerable<T>
またはCollection: TEnumerable<T>
のいずれかの入力パラメータを受け取る3つのオーバーロードされたバリアントがあります。すべての標準ジェネリックコンテナは、同様のパターンに従います。
それは私がそれをした方法です:i:= 0〜n - 1 do result.Add(i);しかし、私はそのようなジェネリック関数が存在するかどうか疑問に思っていました。 – Mihaela
ラムダ/クロージャ/アノオン関数の構文は、デルファイではCLUNKYなので、 'for'ループには必要ないことはかなり素晴らしいです。いつものようにC++のイディオムは、パスカルにうまく翻訳しないでください。しかし、C#とDelphiはかなり近いです。 –
私はC++で非常に便利だと思います。コードは(小さな匿名関数に対して)より洗練されているだけでなく、C++ではインライン展開され、より高速なコードを生成することがよくあります。 – Mihaela