高效删除 D 中数组中的第 N 个元素
Efficient drop every N-th element in array in D
从 D 中的数组中删除每个第 N 个元素可以用 filter
和 map
实现。例如:
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
但它实际上是如何工作的。我尝试在文档示例之后重现,但只得到 true
作为 return 值。
如何在不使用 回退到 for 循环的情况下一次性完成 ?
dropN
performs two passes filter
and map
D 范围是惰性的。在您的示例中,filter
和 map
不会 "iterate" 超过其输入范围,只有 array
会。所以,已经是单程了。
dropN
的另一种实现方式是:
return arr.chunks(n).map!(r => r.take(n-1)).joiner.array;
性能看起来不太理想的一点是 array
不知道范围的长度(由于 filter
或 map
+joiner
),这导致它在构建结果数组时使用附加程序。
从 D 中的数组中删除每个第 N 个元素可以用 filter
和 map
实现。例如:
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
但它实际上是如何工作的。我尝试在文档示例之后重现,但只得到 true
作为 return 值。
如何在不使用 回退到 for 循环的情况下一次性完成 ?
dropN
performs two passesfilter
andmap
D 范围是惰性的。在您的示例中,filter
和 map
不会 "iterate" 超过其输入范围,只有 array
会。所以,已经是单程了。
dropN
的另一种实现方式是:
return arr.chunks(n).map!(r => r.take(n-1)).joiner.array;
性能看起来不太理想的一点是 array
不知道范围的长度(由于 filter
或 map
+joiner
),这导致它在构建结果数组时使用附加程序。