Я нахожусь в процессе обучения D (я решил, что это будет более удобный для начинающих язык, чем C++), и я решил дать себе упражнение по реализации общей быстрой сортировки в D. Моя программа отлично работает при сортировке целых чисел, но он не компилируется и выдает странную ошибку при сортировке строк.Странная ошибка при сортировке строк с помощью D
Вот мой код:
import std.stdio, std.algorithm;
T[] quickSort(T)(T[] input) {
if (input.length <= 1) {return input;}
ulong i = input.length/2;
auto pivot = input[i];
input = input.remove(i);
T[] lesser = [];
T[] greater = [];
foreach (x; input) {
if (x<=pivot)
{
lesser ~= x;
}
else
{
greater ~=x;
}
}
return (quickSort(lesser) ~ cast(T)pivot ~ quickSort(greater));
}
void main() {
//Sort integers, this works fine
//writeln(quickSort([1,4,3,2,5]));
//Sort string, throws weird error
writeln(quickSort("oidfaosnuidafpsbufiadsb"));
}
Когда я запускаю его на шнурке он выдает эту ошибку:
/usr/share/dmd/src/phobos/std/algorithm.d(7397): Error: template std.algorithm.move does not match any function template declaration. Candidates are:
/usr/share/dmd/src/phobos/std/algorithm.d(1537): std.algorithm.move(T)(ref T source, ref T target)
/usr/share/dmd/src/phobos/std/algorithm.d(1630): std.algorithm.move(T)(ref T source)
/usr/share/dmd/src/phobos/std/algorithm.d(1537): Error: template std.algorithm.move cannot deduce template function from argument types !()(dchar, dchar)
/usr/share/dmd/src/phobos/std/algorithm.d(7405): Error: template std.algorithm.moveAll does not match any function template declaration. Candidates are:
/usr/share/dmd/src/phobos/std/algorithm.d(1786): std.algorithm.moveAll(Range1, Range2)(Range1 src, Range2 tgt) if (isInputRange!(Range1) && isInputRange!(Range2) && is(typeof(move(src.front, tgt.front))))
/usr/share/dmd/src/phobos/std/algorithm.d(7405): Error: template std.algorithm.moveAll(Range1, Range2)(Range1 src, Range2 tgt) if (isInputRange!(Range1) && isInputRange!(Range2) && is(typeof(move(src.front, tgt.front)))) cannot deduce template function from argument types !()(string, string)
helloworld.d(9): Error: template instance std.algorithm.remove!(cast(SwapStrategy)2, string, ulong) error instantiating
helloworld.d(31): instantiated from here: quickSort!(immutable(char))
helloworld.d(31): Error: template instance helloworld.quickSort!(immutable(char)) error instantiating
Спасибо. Не удаляет ли стержень какой-либо разницы по алгоритму? Кроме того, что именно делает .dup? Разве это не сделало бы еще неизменной версию строки? Почему это исправляет проблему изменения? Отличный ответ, мне просто нравится учиться, задавая вопросы. Редактировать: Я пробовал .dup, и это, похоже, не имеет значения – picklebobdogflog
no 'dup' делает измененную копию, если вы хотите неизменную копию, тогда используйте' idup' –
Если вы еще не читали ее, я может рекомендовать книгу Али Чихели: http://ddili.org/ders/d.en/index.html Это поможет вам встать на ноги с D. – fwend