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仅引用而不拥有这些节点.如果无特定知识,无法判断.

posted @   zjh6  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示