将 qsort() 与类指针一起使用

Posted

技术标签:

【中文标题】将 qsort() 与类指针一起使用【英文标题】:Using qsort() with class pointers 【发布时间】:2011-06-22 23:28:19 【问题描述】:

我正在使用内置函数qsort()class item 指针向量进行排序。

class item 
int value;
vector<char> c;
...
...
;

//Declaration of vector
vector<item*> items;

//Function Call
qsort(&items, items.size(), sizeof(item*), value_sort);

int value_sort(const void* a, const void* b)

item* pa = *(item**) a;
item* pb = *(item**) b;

if (pb->value < pa->value)
    return 1;
else if (pa->value < pb->value)
    return -1;
return 0;

在调试器模式下,指针papb 都不指向有效位置。由papb 指向的class items 的所有数据成员集包含垃圾值。我在哪里犯错?我也不确定双指针的用法。

谢谢。

【问题讨论】:

你为什么使用 qsort? 你在填充向量吗?查看该代码将有所帮助。实际上,您似乎正在对一个空向量进行排序。 @Fred:是的,我正在填充向量。 【参考方案1】:

我同意建议使用std::sort 的答案。但是暂时忽略这一点,我认为您的问题的原因是您传递了 vector 对象的地址,而不是向量的内容。试试这个:

//Function Call
qsort(&items[0], items.size(), sizeof(item*), value_sort);

然后在您尝试之后,返回并改用std::sort。 8v)

【讨论】:

@ajmartin:酷。但我希望您注意有关使用std::sort 的建议。它更干净,更容易,更不容易出错。与函数对象一起使用,它也可能更快。编译器可以利用内联,这是函数指针方法无法做到的。 已采纳并实施建议。谢谢:)【参考方案2】:

不要在 C++ 中使用qsort,而是使用std::sort

int value_sort(item* pa, item* pb)

    return pa->value < pb->value;


std::sort(items.begin(), items.end(), value_sort);

【讨论】:

这看起来一定更整洁。谢谢【参考方案3】:

使用来自algorithm 的std::sort。它易于使用,键入安全且比 qsort 更快,并且没有指针问题:)。

#include <algorithm>

inline bool comparisonFuncion( item *  lhs,item  * rhs)

    return lhs->value<rhs->value;


std::sort(items.begin(),items.end(),comparisonFunction);

【讨论】:

lhsrhs 不是指针(因此会出现语法错误),但它们必须与向量的内容相匹配。 @Fred Larson 我将函数. 更改为-&gt;,但忘记更改对指针的引用。感谢您的指点:)。

以上是关于将 qsort() 与类指针一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 qsort() 对指向包含字符串的结构的指针进行排序

C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试题

如何在C中对指向char的指针数组进行qsort?

c_cpp 使用(1)仿函数,(2)函数指针和(3)c风格qsort来分析排序速度

将 app.config 与类库一起使用

将 random.choice() 与类一起使用