我必须完全愚蠢,因为我无法理解这一点:如何在不复制数组的情况下向数组中添加元素.
换句话说,假设我要创建一个大的列表:
int[] arr;
while (...) { // 1,000,000 iterations
...
arr ~= something;
...
}
Run Code Online (Sandbox Code Playgroud)
我不太明白什么时候~=会添加到数组,什么时候会创建它的副本.
为了澄清,我正在寻找像Java或C#中的ArrayList这样的语义,即我可以把东西放进去的一些抽象容器,如果需要的话会增长,但通常保持相同的"对象"(即如果传递等).
它与作品几乎相同ArrayList,因为它具有一个capacity元素的数量,它可以在必须重新分配之前增长到它.然而,由于将数组传递给函数而不是使它成为相同的数组,因此它很复杂.如果您只是使用局部变量而不将其分配给任何东西,那么在重新分配时,除了效率之外,它应该无关紧要.
你应该阅读的文章是:http://dlang.org/d-array-article.html
我认为它使用稍微错误的术语,因为它指的是运行时管理的内存块作为动态数组而不是T[]- 这是规范认为是动态数组,而内存块恰好是目前支持数组的是什么 - 但它很好地解释了D中数组如何工作的许多细节.所以,它应该是很有启发性的.
此外,std.array.Appender如果你做了很多追加,你应该考虑使用.例如
auto app = appender!(int[])();
while (...) { // 1,000,000 iterations
...
app.put(something);
...
}
int[] arr = app.data;
Run Code Online (Sandbox Code Playgroud)
它会使附加效率提高.一般来说,如果你创建数组然后对它们进行操作而不是稍后再添加它们,你可能会做得更好.显然,这并不适合所有用例,但是如果你这样做,那么你永远不必担心一个片段是否仍然引用与另一个片段相同的内存 - 或者以不依赖于两个片段的方式编写代码切片指的是同一个记忆.
另一种方法是使用std.container.Array,它是一个完整的引用类型(而不是像D的动态数组那样的半引用类型).当然,如果你想要传递一个数组,让它的多个片段都引用相同的内存,并继续追加它,你应该考虑使用它Array.
| 归档时间: |
|
| 查看次数: |
606 次 |
| 最近记录: |