使用qsort()与类指针

4

我正在使用内置函数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的所有数据成员集合包含垃圾值。我在哪里犯了错误?我也不确定双指针的用法。
谢谢。

4
你为什么要使用qsort? - Benjamin Lindley
你是否正在填充向量?看一下代码会有帮助。现在的情况是,你似乎在对一个空向量进行排序。 - Fred Larson
@Fred:是的,我正在填充向量。 - ajmartin
3个回答

6

我同意那些建议使用 std::sort 的答案。但是暂时不考虑那个,我认为你的问题在于你传递的是 vector 对象的地址,而不是向量内容。请尝试这样做:

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

然后在尝试完这个之后,回去使用 std::sort。8v)

1
@ajmartin:很酷。但我希望你能听取关于使用std::sort的建议。它更清晰、更简单,也更不容易出错。如果与函数对象一起使用,它很可能还更快。编译器可以利用内联优化,而这是使用函数指针方法无法实现的。 - Fred Larson
1
采纳建议,并已实施。谢谢 :) - ajmartin

4

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

int value_sort(item* pa, item* pb)
{
    return pa->value < pb->value;
}

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

这看起来更整洁。谢谢。 - ajmartin

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);

lhs和rhs不是指针(所以你会有语法错误),但为了匹配向量的内容,它们需要成为指针。 - Fred Larson
@Fred Larson,我在函数.中将其更改为->,但忘记将指针引用进行更改。感谢您的指出 :)。 - UmmaGumma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接