本文介绍了二维的动态数组初始化,步幅和索引操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对不起,这成为对数组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.

这篇关于二维的动态数组初始化,步幅和索引操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 07:34