抱歉,这成为了有关数组的三重问题
我认为(动态)数组在 D 中确实很强大,但以下问题已经困扰我一段时间了:
在 C++ 中,我可以轻松地分配具有指定值的数组,但在 D 中,我还没有找到这样做的方法。当然下面的内容是没有问题的:
int[] a = new int[N];
a[] = a0;
但它看起来效率很低,因为第一行将初始化0
,就像 2 一样a0
。 D 中可以做类似以下的事情吗?
int[] a = new int(a0)[N]; // illegal
在 std.range 中使用 stride 时,我遇到的另一个效率问题是:
import std.stdio;
import std.range;
struct S
{
int x;
this(this)
{
writeln("copy ", x);
}
}
void f(S[] s)
{
}
int main()
{
S[] s = new S[10];
foreach (i, ref v; s)
{
v.x = i;
}
f(stride(s, 3)); // error
return 0;
}
当然,我天真地认为我可以简单地使用 stride 创建一个新数组而不复制它的元素?在D中没有办法这样做吧?
所以我去模拟了数组就像步幅将返回一样,并实现了f
as:
f(s, 3);
void f(S[] s, uint stride)
{
ref S get(uint i)
{
assert (i * stride < s.length);
return s[i * stride];
}
for (uint x ... )
{
get(x) = ...;
}
}
有没有一种方法可以使用索引运算符来代替编写 get(x)get[x]
?这样我就可以静态混合/包含跨步get
函数并保持函数的其余部分类似。我对所采取的方法感兴趣,因为不允许本地结构访问函数范围变量(为什么不呢?)。