我在使用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
循环追加元素来完成,但我认为这可能效率很低(如果我错了请纠正我)。所以问题是,是否有另一种有效的方法来创建一个具有任意数量元素的数组?
答案 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]