d左旋数组
void main()
{
import std.range;
import std.stdio: write, writeln, writef, writefln;
int[] arr1 = [ 1, 2, 3, 4 ];
int t = 0;
writeln(arr1);
for (int j = 0;j<2;j++) {//左旋多少
t = arr1[0];
for(int i = 0;i<arr1.length-1;i++) {
arr1[i] = arr1[i+1];
}
arr1[$-1] = t;
}
writeln(arr1);
}
不带索引,旋转视图:
import std.range : empty;
auto rotatedView(R)(R range)
in (!range.empty)
{
import std.range : chain, front, only, popFront;
const fr = range.front;//.1
range.popFront();
return chain(range, only(fr));
}
void main()
{
import std.algorithm : equal;
int[] arr1 = [ 1, 2, 3, 4 ];
assert(arr1.rotatedView.equal([ 2, 3, 4, 1 ]));
// 现在这有点贵了,:)
assert(arr1
.rotatedView
.rotatedView
.equal([ 3, 4, 1, 2 ]));
}
.1应用:
const fr = range.save.front;
以确保后续调用range.popFront(如,File.byLine)不会无效化或覆盖fr.
很好,但至少对InputRanges,想要的是前面元素副本,(.save不适用File.byLine 😕).
如何一般复制元素?是否必须使用isSomeString来处理所有元素类型.
区间允许下链接两个切片更通用.
auto rotatedView(R)(R range, long n = 1)
if (...)
{
if (n == 0) return range;
...
n %= range.length;
...
return chain(slice1, slice2);
}
没有通用方法来任意深度复制.主要是用户定义类型问题.
如何深度复制RefCounted!T?这样:
static if (isDeepCopyable!(ElementType!R))
auto fr = range.front.deepCopy;
else
auto fr = range.front.save;
可容纳一些纯输入区间(包括File.byLine),但一般仍需要前向区间.
需要在Phobosv2中解决如何处理像File.byLine这样的瞬态区间(即,.popFront无效化.front值的区间).调用.popFront后不需要访问每一行时,.byLine的当前实现会减少分配并降低GC压力.但是,当你确实需要保存它时,会产生像这里违反直觉结果.
没有通用方法来复制元素,因为没有语言级的.clone方法可为每种类型强制正确的语义.不能简单地深度复制某些内容,因为对任意类型,无法判断引用成员是要成为拥有引用(需要克隆)还是非拥有引用(不应克隆).两者都是有效用例,如果没有类型环境知识,就无法区分它们.
如,区间生成,每次调用.popFront的对象树,那么想在保存元素时,深度复制对象树.但是,如果在预先存在图中,区间正在迭代某些节点,那么你在保存.front的值时,可能*不*希望复制图节点,因为这样.front仅引用而不拥有这些节点.如果无特定知识,无法判断.
浙公网安备 33010602011771号