Эта строка является основной проблемой вашего кода.
return a1->s.c_str() - b1->s.c_str();
Причина этого в том, что вы вычитаете два указателя здесь, а это не то, что компаратор должен делать в этом случае.Comparator выполняет сравнение на основе содержимого.
Вместо этого попробуйте следующее:
int length1 = a1->s.size();
int length2 = b1->s.size();
for (int i = 0; i < min(length1, length2); i++) {
if (a1->s[i] != b1->s[i]) { // if characters are not same, return difference of their ASCII values.
return a1->s[i] - b1->s[i];
}
}
return length1 - length2; // if they are same till now, then shorter string should appear first. That's why it is required.
Предложение:
Если вы кодируете в C ++, тогда, пожалуйста, используйте STL.Есть хорошая функция sort()
, заданная <algorithm>
, которая позволяет вам делать то же самое без использования void *
Обновление:
Как справедливо предложено user4581301 , вы можете напрямую использовать std :: string :: Сравнение.
Например:
return (a1->s).compare(b1->s);