我尝试在D中编写非常简单的代码,但我对其中一个标准库模板函数(特别是来自nextPermutation
的{{1}}有一些问题)。
我试图做的关键是创建所有pandigital数字的排列(即包含所有值1到9的数字一次)。
为此,我完成了以下工作:
std.algorithm
这给了我错误:
错误:无法解析nextPermutation的类型!(初始)
我还试图明确设置类型:
import std.algorithm;
import std.conv;
int[] pandigitals()
{
char[] initial = "123456789".dup;
auto pan = [to!int(initial)];
while(nextPermutation!(initial)) {
pan ~= to!int(initial);
}
return pan;
}
但是,这会出错,说它与模板不匹配:
错误:模板实例std.algorithm.nextPermutation!(" a< b",char [])与模板声明nextPermutation不匹配(alias less =" a< b&#34 ;,BidirectionalRange)(ref BidirectionalRange range)if(isBidirectionalRange!BidirectionalRange&& hasSwappableElements!BidirectionalRange)
呼叫的正确形式是什么?
答案 0 :(得分:5)
嗯,你的第一个问题是你将initial
作为模板参数而不是函数参数传递。 !()
用于模板参数。所以,而不是
while(nextPermutation!(initial))
你需要做
while(nextPermutation(initial)) {
现在,这仍然会给你一个错误。
q.d(10): Error: template std.algorithm.nextPermutation cannot deduce function from argument types !()(char[]), candidates are:
/usr/include/D/phobos/std/algorithm.d(12351): std.algorithm.nextPermutation(alias less = "a<b", BidirectionalRange)(ref BidirectionalRange range) if (isBidirectionalRange!BidirectionalRange && hasSwappableElements!BidirectionalRange)
这是因为hasSwappableElements!(char[])
是false
,而nextPermutations
'模板约束,true
类型需要nextPermutations
才能使用false
。< / p>
它是dchar
因为所有字符串都被视为char
的范围,而不是它们的实际元素类型。这是因为在UTF-8(wchar
)和UTF-16(dchar
)中,每个代码点有多个代码单元,因此对单个代码单元进行操作可能会破坏代码点,而在UTF-32(char
),每个代码点总有一个代码单元。从本质上讲,如果wchar
或char
的数组被视为wchar
或dchar
的范围,您将面临分解字符的高风险,这样您就可以结束用字符而不是整个字符。因此,通常在D中,如果您要对单个字符进行操作,则应使用char
,而不是wchar
或hasSwappableElements!(char[])
。如果您对Unicode不是很熟悉,我建议您阅读Joel Spoelsky关于此主题的this article。
但是,无论false
为false
的原因是什么,是 dchar[]
,因此您需要使用其他类型。最简单的方法可能就是将算法交换为使用int[] pandigitals()
{
dchar[] initial = "123456789"d.dup;
auto pan = [to!int(initial)];
while(nextPermutation(initial)) {
pan ~= to!int(initial);
}
return pan;
}
代替。
{{1}}