D 语言 Range 模块:popFrontN、popBackN、popFrontExactly、popBackExactly、moveFront
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.drop,std.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.drop,std.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 个元素。这使得 popFrontExactly 比 popFrontN 更快,但也意味着,如果范围不包含至少 n 个元素,则它会尝试在空范围上调用 popFront,这是未定义的行为。因此,只有在保证范围至少包含 n 个元素时才使用 popFrontExactly。
popBackExactly 的行为与 popFrontExactly 相同,但是它从(双向)范围的后面删除元素。
另请参见:std.range.dropExactly,std.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
原文地址: https://www.cveoy.top/t/topic/oyBh 著作权归作者所有。请勿转载和采集!