在D中将元素连接x到数组items很容易,就好像它是一个数组列表:
arr ~= x;
Run Code Online (Sandbox Code Playgroud)
但是如何删除索引i处的元素items?
(警告:如果我删除一个元素然后添加一个新元素,则不能重新分配该数组.因此,一个简单的切片将不起作用.)
根据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();
}
Run Code Online (Sandbox Code Playgroud)
但是,当你有类似的东西时会出现问题:
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
Run Code Online (Sandbox Code Playgroud)
片的基本阵列应该不如果元件被从切片除去修改; 相反,需要复制切片.
但是我无法知道数组是否是更大数组的一部分...所以这不起作用.
有什么建议?
And*_*scu 20
在digitalmars.D上复制我的答案(感谢转发):
如前所述,std.algorithm.remove可以提供帮助.您可能希望特别关注其中的三个功能:(a)在一次传递中删除多个偏移,例如删除(a,0,4)删除第一个和第五个元素,(b)您可以删除子范围,例如删除( a,元组(1,3))删除第二个到第四个元素,(c)如果您不关心删除后元素的保留顺序,您可能需要查看不稳定的删除,这相当少的工作.
安德烈
Vla*_*eev 12
(警告:如果我删除一个元素然后添加一个新元素,则不能重新分配该数组.因此,一个简单的切片将不起作用.)
该assumeSafeAppend函数将告诉运行时在附加数组时不重新分配数组(即,来自用户的肯定是没有其他切片可能被附加程序踩踏).
remove从std.algorithm执行就地删除.如果你正在使用std.container,那也是Array.linearRemove.