2013-09-26 1 views
1

Я нахожусь в процессе обучения 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 

ответ

3

проблема заключается в том, что строки являются неизменными, так remove не будет работать (как он управляет строкой)

вы можете исправить это, не снимая и не вставляя стержень в конкат:

auto pivot = input[i]; 
//input = input.remove(i); //<- remove this line 
T[] lesser = []; 
//... 
return (quickSort(lesser) ~ quickSort(greater)); //<- remove cast(T)pivot ~ 

или пропусканием в DUP:

writeln(quickSort("oidfaosnuidafpsbufiadsb".dup)); 
+0

Спасибо. Не удаляет ли стержень какой-либо разницы по алгоритму? Кроме того, что именно делает .dup? Разве это не сделало бы еще неизменной версию строки? Почему это исправляет проблему изменения? Отличный ответ, мне просто нравится учиться, задавая вопросы. Редактировать: Я пробовал .dup, и это, похоже, не имеет значения – picklebobdogflog

+1

no 'dup' делает измененную копию, если вы хотите неизменную копию, тогда используйте' idup' –

+1

Если вы еще не читали ее, я может рекомендовать книгу Али Чихели: http://ddili.org/ders/d.en/index.html Это поможет вам встать на ноги с D. – fwend

3

Вы должны поставить «D» за строкой, чтобы сделать его в кодировке UTF-32, в противном случае удалить не будет принимать его.

writeln(quickSort("oidfaosnuidafpsbufiadsb"d.dup));