【发布时间】:2015-08-24 08:13:43
【问题描述】:
专用于内置数组的范围原语消耗它们的源,但人们可以轻松地设计一个范围系统,该系统宁愿基于源的.ptr(乍一看更灵活)。
struct ArrayRange(T)
{
private T* _front;
private T* _back;
this(ref T[] stuff) {
_front = stuff.ptr;
_back = _front + stuff.length;
}
@property bool empty(){return _front == _back;}
@property T front(){ return *_front;}
@property T back(){return *_back;}
void popFront(){ ++_front;}
void popBack(){--_back;}
T[] array(){return _front[0 .. _back - _front];}
typeof(this) save() {
auto r = this.array.dup;
return typeof(this)(r);
}
}
void main(string[] args)
{
auto s = "bla".dup;
// here the source is 'fire-proofed'
auto rng = ArrayRange!char(s);
rng.popFront;
assert (s == "bla");
assert (rng.array == "la");
// default primitives: now the source is consumed
import std.array;
s.popFront;
assert (s == "la");
}
为什么默认系统不基于指针算法,因为弹出前端意味着重新分配/效率较低?
这种设计有什么理由吗?
【问题讨论】:
-
你的代码和 stdlib 的东西应该编译成完全正确的代码......编写高效代码的重要提示:不要假设事情,实际检查编译器和库的作用!
标签: range d pointer-arithmetic