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
仅引用而不拥有
这些节点.如果无特定
知识,无法判断.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现