在D语言中,将元素x
连接到数组items
中非常容易,就像它是一个数组列表一样:
arr ~= x;
但是我该如何从items
中删除索引为i
的元素呢?
(注意:如果我删除一个元素然后添加一个新元素,数组不能被重新分配。因此,简单的切片不起作用。)
更新:
根据CyberShadow关于使用assumeSafeAppend
的答案,我编写了以下代码:
static void removeAt(T)(ref T[] arr, size_t index)
{
foreach (i, ref item; arr[index .. $ - 1])
item = arr[i + 1];
arr = arr[0 .. $ - 1];
arr.assumeSafeAppend();
}
然而,当你有类似以下内容时就会出现问题:
auto superArr = [0, 1, 2, 3, 4]; //Must not be modified
auto arr = superArr[0 .. $ - 1];
writeln(superArr);
arr.removeAt(0); //Should copy the slice and modify the copy
writeln(superArr); //but obviously doesn't
如果从切片中删除一个元素,则不应修改其基本数组;而是需要复制该切片。
但是我无法确定数组是否是更大数组的一部分...所以这不起作用。
有什么建议吗?
arr[i..j]
不是arr
的一个切片吗?那么在删除之前不会重新分配内存吗?我不明白当j == arr.length
时的问题在哪里... - user541686