Mih*_*ela 11 delphi generics containers delphi-xe
我可以在C++中执行以下操作
for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;});
Run Code Online (Sandbox Code Playgroud)
我想在Delphi中做同样/类似的事情.我之前向C++开发人员提出了一个问题,并希望在OOP Pascal中生成类似的示例.问题的lambda(匿名方法)部分真的不相关,但我想知道我是否可以在Delphi XE2中做同样的事情.
我问,因为我有XE,我不确定它是否已被添加.谢谢.
可能是最接近德尔福类似物std::vector<T>
是TList<T>
.您可以使用循环遍历列表for in
:
var
Item: Integer;
List: TList<Integer>;
....
for Item in List do
Writeln(Item);
Run Code Online (Sandbox Code Playgroud)
如果你有动态数组而不是a,TList<T>
那么你可以使用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>
.所有标准通用容器都遵循类似的模式.