【发布时间】:2016-01-05 19:05:02
【问题描述】:
我在使用 c++ qsort 比较函数正确按字典顺序对 2d 整数数组进行排序时遇到问题。我已经在这里阅读了许多类似的问题,但没有成功。在制作自定义比较函数时,其参数的形式为
int compar (const void* p1, const void* p2)
现在,我知道它的参数是指向我的变量的指针,每个指针指向我的数组的一行。我想使用类似以下的方法以常规方式索引和比较我的数组。
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 等,这不是让它更容易,我仍然需要进行类型转换吗?
-
不,你没有。 C++ 有 模板 可以在编译时优雅地处理类型。
std::sort是一个光辉的榜样 -
你是否真的有一个二维数组,在这种情况下,即使你“更正”它,转换也是非常错误的,还是一个一维指针数组?
标签: c++ c arrays pointers qsort