调用排序映射后阵列上

问题描述 投票:3回答:1

我想修剪白色空间关闭后,从线路长度stdin读行进行排序。该代码按预期工作。

import std.algorithm, std.array, std.stdio, std.string;

void main()
{
    stdin
        .byLineCopy
        .map!(strip)
        .array
        .sort!((a, b) => a.length < b.length)
        .each!writeln;
}

但是,如果我换map符合array线,

void main()
{
    stdin
        .byLineCopy
        .array
        .map!(strip)
        .sort!((a, b) => a.length < b.length)
        .each!writeln;
}

该程序无法编译,并出现以下错误,

sort_lines.d(9): Error: template std.algorithm.sorting.sort cannot deduce function from argument types !((a, b) => a.length < b.length)(MapResult!(strip, string[])), candidates are:
/usr/include/dmd/phobos/std/algorithm/sorting.d(1852):        std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range)
Failed: ["/usr/bin/dmd", "-v", "-o-", "sort_lines.d", "-I."]

我不明白为什么。不映射函数适用于每个元素的范围,并返回一个新的范围是多少?根据文件,sort要求其范围参数是随机访问的。是什么原因呢?如果是这样,什么是map返回范围的类型?

d
1个回答
2
投票

map返回不具有分配的或可切换元素的范围内 - 即sort指定另一要求。该解决方案是,如在第一个例子中,迭代到一个数组第一。

因为map不计算,不按裁判返回值的元素是不可转让。因此,即使你没有抢到返回元素的地址,并改写与该位置上的新的价值,它不会改变实际的支持数组中的值。

这个问题实际上比这个稍微差一些。什么[1,2,3].map!(a => a * 2)确实是需要一个元件[1,2,3],如果我不喜欢的东西[1,2,3].map!(a => a * 2)[0] = 4,这将有反转功能a => a * 2找出价值投入[1,2除以2乘以它, 3],并把它变成[2,2,3]。在这相对容易,但如果我试图指派5而不是4个以上的情况下?如果映射功能是什么单向散列?正如我们所看到的,唯一的解决方法就是用mapped值的商店 - 即[1,2,3].map.array

© www.soinside.com 2019 - 2024. All rights reserved.