Range 模块

popFrontN

size_t popFrontN(Range)(ref Range r, size_t n)
if (isInputRange!Range);

如果 Range 是一个输入范围,则 popFrontN 立即将 r 本身(而不是副本)向前移动 n 次(通过调用 r.popFront)。popFrontN 通过引用获取 r,因此它会改变原始范围。对于支持切片并具有长度的范围,该操作在 Ο(1) 步骤内完成。对于所有其他范围,该操作的时间为 Ο(n)。

popBackN 的行为与 popFrontN 相同,但是它从(双向)范围的后面删除元素。

返回值:实际上,r 移动了多少,如果 r 没有至少 n 个元素,则可能小于 n

另请参见:std.range.dropstd.range.dropBack

示例:

int[] a = [1, 2, 3, 4, 5];
a.popFrontN(2);
writeln(a); // [3, 4, 5]
a.popFrontN(7);
writeln(a); // []

popBackN

size_t popBackN(Range)(ref Range r, size_t n)
if (isBidirectionalRange!Range);

popBackN 的行为与 popFrontN 相同,但是它从(双向)范围的后面删除元素。

返回值:实际上,r 移动了多少,如果 r 没有至少 n 个元素,则可能小于 n

另请参见:std.range.dropstd.range.dropBack

示例:

int[] a = [1, 2, 3, 4, 5];
a.popBackN(2);
writeln(a); // [1, 2, 3]
a.popBackN(7);
writeln(a); // []

popFrontExactly

void popFrontExactly(Range)(ref Range r, size_t n)
if (isInputRange!Range);

如果 Range 是一个输入范围,则 popFrontExactly 立即将 r 本身(而不是副本)向前移动 n 次(通过调用 r.popFront)。popFrontExactly 通过引用获取 r,因此它会改变原始范围。对于支持切片并具有长度或是无限的范围,该操作在 Ο(1) 步骤内完成。对于所有其他范围,该操作的时间为 Ο(n)。

注意:与 popFrontN 不同,popFrontExactly 将假定范围至少包含 n 个元素。这使得 popFrontExactlypopFrontN 更快,但也意味着,如果范围不包含至少 n 个元素,则它会尝试在空范围上调用 popFront,这是未定义的行为。因此,只有在保证范围至少包含 n 个元素时才使用 popFrontExactly

popBackExactly 的行为与 popFrontExactly 相同,但是它从(双向)范围的后面删除元素。

另请参见:std.range.dropExactlystd.range.dropBackExactly

示例:

auto a = [1, 2, 3];
a.popFrontExactly(1);
writeln(a); // [2, 3]
a.popBackExactly(1);
writeln(a); // [2]

string s = '日本語';
s.popFrontExactly(1);
writeln(s); // '本語'
s.popBackExactly(1);
writeln(s); // '本'

auto bd = [1, 2, 3].filterBidirectional!'true';
bd.popFrontExactly(1);
assert(bd.equal([2, 3]));
bd.popBackExactly(1);
assert(bd.equal([2]));

moveFront

ElementType!R moveFront(R)(R r);

移动 r 的前面并返回它。

如果 r.front 是一个具有析构函数或复制构造函数的结构,则在将其值移动后将其重置为其 .init 值。否则,它将保持不变。

无论哪种情况,r.front 都处于可销毁状态,不会分配任何资源。

示例:

auto a = [1, 2, 3];
writeln(moveFront(a)); // 1
writeln(a.length); // 3

// 定义一个简单的输入范围
struct InputRange
{
    enum bool empty = false;
    enum int front = 7;
    void popFront() {}
    int moveFront() { return 43; }
}
InputRange r;
// 调用 r.moveFront
writeln(moveFront(r)); // 43
D 语言 Range 模块:popFrontN、popBackN、popFrontExactly、popBackExactly、moveFront

原文地址: https://www.cveoy.top/t/topic/oyBh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录