gpt4 book ai didi

arrays - 如何创建一个具有设定大小但未设定值的数组?

转载 作者:行者123 更新时间:2023-12-02 04:13:34 25 4
gpt4 key购买 nike

如何创建一个数组,该数组具有固定大小,在编译时未知,但具有未设置的值?

本质上我想要像 int immutable([length]); 这样的东西。 length 在编译时未知。显然这不能编译。

最佳答案

它必须是用户定义的。 D 中的内置数组要么是静态的(需要在编译时已知),要么是切片为动态数组(可以调整大小)。

内置选项:

int length = 100;
int[] int_array = new int[length]; // works, contents will be initialized to zero

这与:

相同
int[] int_array;
int_array.length = length;

如果您愿意,您也可以执行 immutable(int)[] ,尽管这样您将无法设置内容...执行此操作的正常方法是编写一个纯函数,用于在可变数组中创建和设置内容,然后返回它:

pure int[] make_array(int length) {
int[] array;
array.length = length;
foreach(i, ref item; array)
item = i; // initialize it to a simple count
return array;
}

// usage:
immutable(int)[] arr = make_array(100); // works
immutable(int[]) iarr = make_array(100); // also works

从纯函数返回的可变数据是一般禁止隐式转换为 imuutable 的异常(exception):因为它来自纯函数,编译器知道它是唯一的引用,并且可以根据请求安全地视为不可变。

第一行和第二行用法的区别是第一行可以重新赋值:arr = Something_else[];/* 很酷 */ 而第二个根本无法更改。没有长度变化,没有内容变化,没有重新分配。

静态数组是一种选择,但需要在编译时知道长度:

int[100] int_array = void; // works, contents uninitialized, non-resizable, but length must be known at compile time

一种可能的策略是声明一个大的 int_array_buffer,然后设置 int_array = int_array_buffer[0 .. length]。尽管如此,int_array 本身仍然可以调整大小。

要获得您想要的一切,它必须是用户定义的类型。仅这些行就可以工作:

struct MyArray(T) {
@disable this(); // disallow default construction; force a length
// this constructor takes a runtime length and allocates the backing
this(size_t length) { backing = new T[length]; }
private T[] backing = void; // actually holds the data, uninitialized
T[] opSlice() { return backing; } // allow easy conversion to a slice
alias opSlice this; // implicit conversion to slice
}

将其传递给函数时,可以传递 MyArray!int 或普通的 int[]。由于别名 this,它将隐式转换为 int[],并且由于 D 切片规则,即使在该函数中调整切片大小,也不会影响您的 MyArray 实例。

让我们看看一些用法:

void main() {
int length = 100; // runtime
// MyArray!int uninitialized; // compile error thanks to @disable this
MyArray!int uninitialized = void; // ok, explicitly uninitialized
uninitialized = MyArray!int(length); // created

// or
auto my_array = MyArray!int(length); // also creates it

// my_array.length = 20; // compile error "my_array.opSlice().length is not an lvalue" - it is not resizable
// my_array ~= 1; // compile again, "cannot append type int to type MyArray!int" - again because it is not resizable

int[] slice = my_array; // works, makes passing it to functions that expect normal arrays easy
}

这应该给你你需要的一切。使用 D 中的包装器结构,您可以有选择地启用和禁用底层类型的功能,而不会降低效率。

关于arrays - 如何创建一个具有设定大小但未设定值的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20227952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com