在D中初始化具有任意数量元素的数组

时间:2014-11-23 14:47:37

标签: arrays d

我在使用D中的数组时偶然发现了一个问题。我需要初始化一个具有预定义值的任意数量元素的数组。

我知道它可以像double[10] arr = 5;那样完成,例如,这将生成一个包含10个值为5的元素的数组。然而,问题是我需要在程序执行期间传递的元素数量。我认为可以这样做:

void test(immutable int x)
{
    double[x] arr = 5;
    writeln(arr);
}
void main() { test(10); }

但这会在编译期间导致Error: variable x cannot be read at compile time

虽然可以通过制作动态数组并通过for循环追加元素来完成,但我认为这可能效率很低(如果我错了请纠正我)。所以问题是,是否有另一种有效的方法来创建一个具有任意数量元素的数组?

2 个答案:

答案 0 :(得分:2)

如果您需要简单的解决方案,可以使用以下代码:

auto len = 10;
double[] arr = new double[len];
arr[] = value;

此代码分配大小为len的新数组。 然后使用value初始化其所有元素。

import std.stdio;

// Simple one.
double[] makeArray1(immutable uint len, immutable double value)
{
    double[] arr;
    arr.length = len;
    arr[] = value;
    return arr;
}

// Shorter variant of the first one.
double[] makeArray2(immutable uint len, immutable double value)
{
    double[] arr = new double[len];
    arr[] = value;
    return arr;
}

// In the case when appending is more convenient for you and you know the space you will need.
// You can reserve some array space and append to it,
// not wondering if any allocation will occur.
double[] makeArray3(immutable uint len, immutable double value)
{
    double[] arr;
    arr.reserve(len);
    foreach(_; 0..len)
        arr ~= value;
    return arr;
}

// Most efficient one. 
// Use it when you need to initialize a lot of elements right after allocation.
double[] makeArray4(immutable uint len, immutable double value)
{
    import std.array : uninitializedArray;
    double[] arr = uninitializedArray!(double[])(len);
    arr[] = value;
    return arr;
}

void main()
{
    uint x = 10;
    writeln(makeArray1(x, 5));
    writeln(makeArray2(x, 5));
    writeln(makeArray3(x, 5));
    writeln(makeArray4(x, 5));
}

Here您可以在线试用:

答案 1 :(得分:0)

您还可以使用带有可变参数的简单模板进行初始化,例如:

T[] Array(T, Elems...)(Elems elems){
    typeof(return) result;
    foreach(elem; elems)
        result ~= elem;
    return result;
}

void main(string args[]){
    auto a = Array!int(0,1,2,3,4,5,6);
    writeln(a);
}

输出:

  

[0,1,2,3,4,5,6]