【发布时间】:2011-05-16 08:53:34
【问题描述】:
在 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
如果一个元素从切片中移除,切片的基本数组应该不被修改;相反,需要复制切片。
但我无法知道一个数组是否是一个更大数组的一部分......所以这不起作用。
有什么建议吗?
【问题讨论】:
-
更新了我对您的编辑的回答。
-
@CyberShadow:那是so hacky,但无论如何我都会使用它。 xD 谢谢!
-
@CyberShadow:等等,实际上,我刚刚尝试过,但它似乎不起作用......你确定它是这样做的吗?
-
对我有用,但是(正如我刚刚意识到的)如果切片位于数组的末尾,它将无法工作......没关系:/
-
@CyberShadow:哦,我明白了...啊,这比我想象的要丑得多很多...:\