问题描述
对不起,这成为对数组3倍的问题。
我认为(动态)阵列是在D中真正强大的,但下面已经困扰了我一段时间:
在C ++中我可以轻松地与指定的值分配一个数组,但在D我还没有找到一种方式来做到这一点。当然,下面是没有问题的:
INT [] A = INT新[N];
一个[] = A0;
但看上去效率低,因为一行将与 0
初始化,而像2 A0
。可以与以下类似的东西在D中做什么?
INT [] A = INT新(A0)[N]; //非法
另一个效率无论我在std.range使用时的步幅有:
进口std.stdio;
进口std.range;的struct
{
INT X; 这(本)
{
writeln(复制,X);
}
}无效F(S [] S)
{
}诠释的main()
{
S [] S =新S [10];
的foreach(我,裁判伏; S)
{
V.X = I;
} F(步幅(S,3)); //错误
返回0;
}
当然,我是天真的想法我可以简单地用步幅不复制它的元素,创造出一个新的数组?有没有办法在D中这样做,对吧?
于是我就和模拟为如果阵列作为步幅将返回,并实施˚F
为:
F(S,3);无效F(S [] S,UINT步幅)
{
REF小号弄(UINT I)
{
断言(我*步幅< s.length);
返回小号[我*步幅]
} 对于(UINT X ...)
{
得到(X)= ...;
}
}
会不会有使用索引操作符的方式,而不是写得到(X) GET [X]
?这样我可以静态地混入/包括跨步 GET
功能,并保持类似功能的其余部分。我很想在所采取的方法,因为当地的结构是不允许访问函数范围内的变量(为什么不呢?)。
Use std.array.uninitializedArray
S[] s = uninitializedArray!(S[])(N);
s[] = a0;
Your function f
has an S[]
as an argument, which is different from what stride
returns. The D way to solve this is to make your f
function accept any range by making it a template:
void f(Range)(Range s)
{
foreach (item; s)
// use item
}
S[] s = new S[10];
f(s); // works
f(stride(s, 3)); // works too
Alternatively you can copy the array:
f(array(stride(s, 3)));
But you probably want to avoid copying the entire array if it is large.
You can overload the indexing operator in your own struct.
struct StrideArray
{
this(S[] s, uint stride) { m_array = s; m_stride = stride; }
S opIndex(size_t i) { return s[i * m_stride]; }
void opIndexAssign(size_t i, S value) { s[i * m_stride] = value; }
private S[] m_array;
private uint m_stride;
}
This is (kind of) the way the actual stride
function works. I'd recommend reading up on Ranges.
这篇关于二维的动态数组初始化,步幅和索引操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!