D中数组中第N个元素的有效删除

问题描述 投票:0回答:1

可以使用filtermap来实现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执行两遍filtermap。我试图利用std.algorithm.searching中的skipOver,但是它实际上是如何工作的。我尝试在doc示例之后进行重现,但仅将true作为返回值。

如何在一次传递中完成[[没有退回到for循环?

d
1个回答
2
投票
[dropN执行两遍filtermap
D范围是懒惰的。在您的示例中,filtermap不会在其输入范围内“重复”,只有array会重复。因此,它已经是单遍了。

dropN的替代实现是:

return arr.chunks(n).map!(r => r.take(n-1)).joiner.array;

[性能似乎不是最理想的一点是array不知道范围的长度(由于[C​​0]或filter + map),这导致它在构建结果数组时使用附加器。

© www.soinside.com 2019 - 2024. All rights reserved.