Вот что я делаю, в основном сортирую массив динамически генерируемых C-строк, это будет комбинация «abc», а длина для краткости меньше 5. Что сбивает с толку / интересно, это как настроить функцию сравнения, чтобы она не сравнивала C-строки по адресам памяти
srand ( time(NULL) );
char alpha[] = "abc";
char** CString = new char*[either 5 or 1000];
unsigned int j=0;
for (unsigned int i=0; i<either 5 or 1000;i++) {
int ran = rand() % 5 + 2;
CString[i] = new char[ran];
for(j=0;j<ran-1;j++){
CString[i][j] = alpha[rand() % (sizeof(alpha) - 1)];
}
CString[i][ran-1] = '\0';
}
std::sort(CString,CString+either 5 or 1000,SortCompare);
for(int i=0;i<5;i++){
std::cout << *(CString+i) << " at " << CString+i << std::endl;
}
Теперь у меня есть три конфигурации для функции сравнения
int SortCompare(char* a, char* b){
//return a<b;
//return *a<*b;
//return strcmp(a,b);
}
и распечатка была
return strcmp(a,b):
CRASHED! //bummed because I had high hope for this
return a<b:
(when 5 C-strings): (when 1000 C-strings):
abba at 001F3248 cbccb at 00544388
bcb at 001F324C caac at 0054438C
cbb at 001F3250 bcbc at 00544390
c at 001F3254 ac at 00544394
ca at 001F3258 a at 00544398
//conclusion: it's sorted by addresses. so turning head to the other one
return *a<*b:
(when 5 C-strings): (when 1000 C-strings):
abba at 001F3248 cbccb at 00544388
bcb at 001F324C caac at 0054438C
cbb at 001F3250 bcbc at 00544390
c at 001F3254 ac at 00544394
ca at 001F3258 a at 00544398
//I assumed it's value-sorted //seriously hurt, belief has been destroyed seeing the memory addresses line up so neatly
Следовательно, какая версия является правильной для сортировки по значению? Или я на неправильном пути. Нужен спасатель! Спасибо
Если у вас никогда нет указателей NULL:
bool SortCompare(char const* const a, char const* const b)
{
return std::strcmp(a, b) < 0;
}
если ты делать есть указатели NULL, это только немного более многословно:
bool SortCompare(char const* const a, char const* const b)
{
return a && (!b || std::strcmp(a, b) < 0);
}
Других решений пока нет …