Function std.range.primitives.popFrontExactly
Eagerly advances r
itself (not a copy) exactly n
times (by
calling r
). popFrontExactly
takes r
by ref
,
so it mutates the original range. Completes in Ο(1
) steps for ranges
that support slicing, and have either length or are infinite.
Completes in Ο(n
) time for all other ranges.
void popFrontExactly(Range)
(
ref Range r,
size_t n
)
if (isInputRange!Range);
Note
Unlike popFrontN
, popFrontExactly
will assume that the
range holds at least n
elements. This makes popFrontExactly
faster than popFrontN
, but it also means that if range
does
not contain at least n
elements, it will attempt to call popFront
on an empty range, which is undefined behavior. So, only use
popFrontExactly
when it is guaranteed that range
holds at least
n
elements.
popBackExactly
will behave the same but instead removes elements from
the back of the (bidirectional) range instead of the front.
See Also
std
, std
Example
import std .algorithm .comparison : equal;
import std .algorithm .iteration : filterBidirectional;
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 = filterBidirectional!"true"([1, 2, 3]);
bd .popFrontExactly(1);
assert(bd .equal([2, 3]));
bd .popBackExactly(1);
assert(bd .equal([2]));
Authors
Andrei Alexandrescu, David Simcha, and Jonathan M Davis. Credit for some of the ideas in building this module goes to Leonardo Maffi.