可以使用filter
和map
来实现D中数组中第N个元素的删除。例如:
dchar[] dropN(size_t n, dchar[] arr) {
return darr.enumerate(1).filter!(tup => tup.index % n != 0).map!(a => a.value).array;
}
void main() {
dchar[] darr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'];
dropN(3, darr); // ['a', 'b', 'd', 'e', 'g', 'h', 'j', 'k']
}
但是,dropN
执行两遍filter
和map
。我试图利用std.algorithm.searching中的skipOver
,但是它实际上是如何工作的。我尝试在doc示例之后进行重现,但仅将true
作为返回值。
如何在一次传递中完成[[没有退回到for循环?
dropN
执行两遍filter
和map
D范围是懒惰的。在您的示例中,filter
和map
不会在其输入范围内“重复”,只有array
会重复。因此,它已经是单遍了。
dropN
的替代实现是:
return arr.chunks(n).map!(r => r.take(n-1)).joiner.array;
[性能似乎不是最理想的一点是
array
不知道范围的长度(由于[C0]或filter
+map
),这导致它在构建结果数组时使用附加器。