У меня возникла проблема с использованием функции сравнения qsort C++ для корректного лексикографического сортировки 2-мерного массива int. Я уже прочитал много подобных вопросов здесь, но без успеха. При создании пользовательской функции сравнения, ее аргументы в видеСортировка 2D-массивов с qsort - правильное typecasting
int compar (const void* p1, const void* p2)
теперь, я знаю, что это аргументы являются указателями на мой переменные, которые каждый ponters к одной строке моего массива. Я хотел бы индексировать и сравнивать свой массив обычным обычным способом, используя что-то вроде следующего.
if(p1[0] <= p2[0]) {...}
Потому что я знаю, что формат
p1[i]
это просто ярлык для арифметики указателей, я думаю, когда я ПОЛУЧАТЬ аргумент «указатель на указатель на INT», я должен типаж и использовать это так:
if(*(int**)p1[0] <= *(int**)p2[0]) {...}
Компилятор однако дает мне много этих ошибок
main.cpp:8:20: error: ‘const void*’ is not a pointer-to-object type
main.cpp:8:37: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
Вопрос в том, как правильно вывести этот тип, чтобы он мог сравнивать мои строки. Кроме того, я хотел бы понять, что я делаю неправильно здесь, чтобы избежать ошибок, связанных с указателями, в будущем.
В C++ вы можете захотеть рассмотреть 'std :: sort' вместо' qsort' –
Но по-прежнему необходимо использовать эту функцию пользовательского сравнения, и потому, что мне нужно отсортировать мой массив по-разному - лексикографически на cols 231, 321, 123 и так, это не упрощает, мне все еще нужно приписывать или нет? – fifco
Нет, нет. C++ имеет ** шаблоны **, чтобы обрабатывать типы изящно во время компиляции. 'std :: sort' - яркий пример. –