D 从RangeOfRanges到RangeOfRanges的范围

D 从RangeOfRanges到RangeOfRanges的范围,d,D,在D中,可以执行以下操作来创建数组元素的成对元组: auto a = [0, 1, 2, 3, 4]; auto x = a.zip(a.save.dropOne); x现在可以扩展到[[0,1],[1,2],[2,3],[3,4] 我想概括这个概念,创建如下的n元组: auto i = 0; auto x = zip(generate!(() => a.save.dropExactly(i++)).take(n)); 然而,这导致x成为元组的一个范围!([1,2,3,4]),元组!(

在D中,可以执行以下操作来创建数组元素的成对元组:

auto a = [0, 1, 2, 3, 4];
auto x = a.zip(a.save.dropOne);
x
现在可以扩展到
[[0,1],[1,2],[2,3],[3,4]

我想概括这个概念,创建如下的n元组:

auto i = 0;
auto x = zip(generate!(() => a.save.dropExactly(i++)).take(n));
然而,这导致
x
成为
元组的一个范围!([1,2,3,4]),元组!([2,3,4])
表示n=2

这是合理的,因为
take
生成子范围。但是如何创建单独的范围来实现预期的行为呢


提前谢谢。

如果我没听错的话,你在找类似的东西。它已经是火卫一的一部分,将包含在下一版本(2.076.0)中:

assert([0,1,2,3])。幻灯片(2)。相等!相等(
[[0, 1], [1, 2], [2, 3]]
));
断言(5.iota.幻灯片(3).相等!相等(
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
));
但是,请注意,对于随机访问范围,很容易实现开箱即用的滑动窗口迭代器:

导入标准范围,标准标准;
void main(字符串[]args)
{
自动arr=5.5 iota;
自动n=2;
//平面D阵列与切片
foreach(i;0..arr.length-n+1)
arr[i..i+n].writeln;
// [0, 1], [1, 2], [2, 3], [3, 4]
//作为一个范围
arr=10.5微特;
n=3;
int k=0;
生成!(()=>arr[k..k+++n]).take(3).writeln;
// [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
n=4,k=0;
生成!(()=>arr[k..k+++n]).take(3).writeln;
// [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]]
}

.

你能举一个“预期行为”的例子吗?我不明白这个问题。对于n=2,我希望能够使用
generate
x
扩展到
[[0,1]、[1,2]、[2,3]、[3,4]
generate
几乎可以工作:
generate!(()=>arr[k..min(k+++n,arr.length)]).take(3.writeln获取所有可能的子范围,则code>也会起作用。正如前面提到的-这取决于您想要实现的目标。如果您能够澄清这一点,帮助您会更容易;-)如果切片的结尾不受限制,则会出现范围冲突。2.076.0中的幻灯片发生了什么?发布了吗?我在dlang.org上找不到它。不幸的是,由于最后一分钟的复杂性,它的发布被推迟了,但它已经在std/range.d中(以防你想复制/粘贴到你的项目中)。