如何检查Dlang中的数组或范围长度是否至少为N

如何检查Dlang中的数组或范围长度是否至少为N,d,phobos,D,Phobos,对于N=1,我将使用std.array:empty检查长度是否至少为N,并避免遍历整个输入 对于N>1(或全部N),D语言的惯用方式是什么 我尝试使用std.range:take,它“惰性地只占用范围中的n个元素”。它适用于数组,但不适用于范围(当然,除非我将子范围设置为数组): 你想要什么 bool lengthAtLeast(R)(R input, size_t n) { import std.range.primitives : walkLength; return inp

对于N=1,我将使用
std.array:empty
检查长度是否至少为N,并避免遍历整个输入

对于N>1(或全部N),D语言的惯用方式是什么

我尝试使用
std.range:take
,它“惰性地只占用范围中的n个元素”。它适用于数组,但不适用于范围(当然,除非我将子范围设置为数组):

你想要什么

bool lengthAtLeast(R)(R input, size_t n)
{
    import std.range.primitives : walkLength;
    return input.walkLength(n) >= n; // walks upTo n or returns the length if known
}

walkLength
应适用于所有范围(输出范围除外,但它们是非常不同的beast)。因为数组是范围,所以它应该覆盖所有的基。如果给定的范围“有”一个长度,我不确定当它想要返回它时,它实际上不会花费O(整个长度)。我认为在某些情况下,它将通过用尽整个范围来计算!因此,理论上可能会有更好的答案。如果某个范围具有
长度
,则将使用它。否则,范围将被迭代以计算元素的数量。实际上,我希望在所有类型的输入上确保尽可能高的时间和空间效率,因此我想知道我使用
take(n).array
的方法是否会因此更好。然而,我的方法中的
.array
可能会导致空间效率低下,因此我可能需要一种通过更奇特的模板的组合方法。我已经在一个紧密循环中测试了每种输入类型500K次不同的断言,并且整个程序都在这个循环下预编译。对于切片
DList
@BioTronic的解决方案比我的快1.5倍,对于普通阵列比我的快2倍。使用(R)DMD 2.082.0,无任何开关。
bool lengthAtLeast(R)(R input, size_t n)
{
    import std.range.primitives : walkLength;
    return input.walkLength(n) >= n; // walks upTo n or returns the length if known
}