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

Efficient drop every N-th element in array in D

从 D 中的数组中删除每个第 N 个元素可以用 filtermap 实现。例如:

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 但它实际上是如何工作的。我尝试在文档示例之后重现,但只得到 true 作为 return 值。

如何在不使用 回退到 for 循环的情况下一次性完成

dropN performs two passes filter and map

D 范围是惰性的。在您的示例中,filtermap 不会 "iterate" 超过其输入范围,只有 array 会。所以,已经是单程了。

dropN 的另一种实现方式是:

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

性能看起来不太理想的一点是 array 不知道范围的长度(由于 filtermap+joiner),这导致它在构建结果数组时使用附加程序。