c++ - 将比较函数传递给 qsort C++

标签 c++ sorting

我的比较函数依赖于 Foo 中的数据成员,因此我希望将它包含在此类中。所有示例都使用有效的全局函数,但它不是我正在寻找的。我希望 Foo 的每个实例都根据对象的当前状态进行不同的比较。

class Foo
{
public:
   Foo(){}

   int Compare(const void * a,const void * b)
   {
    //Comparing logic
    //This is fine
   }

   void SortStuff(void)
   {
    qsort(ObjectArray,MAXOBJECTS,sizeof(Object*), Compare);
   }    

};

最佳答案

正如@juanchopanza 在评论中提到的,强烈建议您在 C++ 中使用 std::sort 而不是 qsortstd::sort 算法正确调用赋值运算符并且是类型安全的,而 qsort 则不然。例如,如果您尝试使用 qsortstd::string 数组进行排序,您将得到未定义的行为。

就是说,如果您绝对必须以这种方式使用 qsort,那么您遇到的问题就是“不可见的 this”指针。在 C++ 中,成员函数与自由函数有着根本的不同,因为为了调用成员函数,您需要提供一个接收者对象。在你上面写的代码中,你得到一个错误,因为 qsort 需要一个可以用两个参数调用的自由函数,但是你给它一个需要两个参数的成员函数,这实际上确实需要三个参数 - 一个接收器对象和两个指针。

要解决此问题,您有几种选择。一种选择是将函数标记为 static,表明它是一个作用域在您的类内的自由函数,而不是成员函数。另一种选择是使用 lambda 来定义比较函数,因为没有捕获列表的 C++ lambda 是自由函数。实际上,除非您需要在多个地方使用比较功能,否则我实际上会推荐第二个选项而不是第一个选项,因为它更清楚地表明您只需要一次性使用该功能。

关于c++ - 将比较函数传递给 qsort C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894665/

相关文章:

c++ - block 范围内的 thread_local

c++ - 在死锁 futex 中调用 malloc 和程序时出现段错误

c++ - 可选的仅 header 库

python - 如何自定义排序要在 json.dumps 中使用的字典列表

C++ 冒泡排序

c++ - 关于循环变量优化的标准合规行为是什么?

c++ - 复制结构的一部分

php - 为什么 asort 与多维数组一起使用?

html - 排序触控笔内容

c - 如何在 C 中按日期打印目录中的文件名列表?