сортировка — qsort в C ++ для строковых массивов?

Я работаю над программой, которая берет список слов, введенных пользователем, игнорирует регистры (верхний и нижний), а затем сортирует их, используя функцию qsort. У меня проблема с qsort в том, что я не знаю, что передать как 3-й элемент qsort (array, sizeOfArray, ??, funcCompare). Может ли кто-нибудь указать мне правильное направление?

using namespace std;

int compare(const void* , const void*);

const int SIZE = 100;
void main()
{

int i = 0;
int s = 0;
size_t size = 0;
string words;
string list[SIZE];
for (i = 0; i < SIZE; i++)
{
cout << "Please enter a word. Press ^Z to quit: " << endl;
cin >> words;
transform(words.begin(), words.end(), words.begin(), ::tolower);
if (words.length() > size)
{
size = words.length();
}
list[i] = words;
if (cin.eof())
{
s = i;
break;
}
}
qsort(list, s, ?? , compare);
for (int j = 0; j < i; j++)
{
cout << list[j] << endl;
}
}

int compare(const void* p1, const void *p2)
{
char char1, char2;

char1 = *(char *)p1;  // cast from pointer to void
char2 = *(char *)p2;  // to pointer to int

if(char1 < char2)
return -1;
else
if (char1 == char2)
return 0;
else
return 1;
}

Место в вопросе qsort имеет «??» Любая помощь, которую вы можете оказать, ценится!

Это назначение

1

Решение

Технически нужно пройти sizeof(string)
Но std :: string не является тривиальным типом, и поэтому вы не можете использовать qsort отсортировать массив строк.

4 Функция подписи:
qsort (void *, size_t, size_t, int (*) (const void *, const void ));
заменяется двумя декларациями:
extern «C» void qsort (void
base, size_t nmemb, size_t size, int (сравните) (const void, const void *));
extern «C ++» void qsort (void * base, size_t nmemb, size_t size, int (сравните) (const void, const void *));
оба из которых имеют то же поведение, что и оригинальное объявление. Поведение не определено, если только
объекты в массиве, на который указывает база, имеют тривиальный тип.

Если вы используете C ++ и std :: string, вы должны использовать также std :: vector вместо обычного массива и std :: sort вместо qsort.

3

Другие решения

Вам нужно передать размер каждого элемента в массиве, в байтах.

Это достигается путем: sizeof(string)

qsort(list, s, sizeof(string), compare);

РЕДАКТИРОВАТЬ: Посмотрите на сообщение alexrider для получения дополнительной информации об этом


Некоторое время назад я написал функцию сравнения строк qsort для BRL-CAD, здесь используется функция сравнения (имейте в виду, что она написана на C, может быть оптимизирована).

 * Sort function called by quick sort to sort data according
* to its second field in the string
*/
int
sort(const void* a, const void* b)
{
char *ia = *(char**)a;
char *ib = *(char**)b;

char Str[MAX_RESULT_LEN];
char Str2[MAX_RESULT_LEN];

//get string into array
GetStr(ia, Str);
GetStr(ib, Str2);

int n1 = atoi(Str);
int n2 = atoi(Str2);
return (n2 - n1);
}
-1

По вопросам рекламы [email protected]