2011-02-07 27 views
4

我正在使用內置函數qsort()來對class item指針的向量進行排序。使用帶類指針的qsort()

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

在調試程序模式,指針既不pa也不pb指向有效的位置。由papb指向的class items的所有數據成員的集合都包含垃圾值。我在哪裏犯錯誤?我也不確定使用雙指針。

謝謝。

+4

你爲什麼使用qsort? – 2011-02-07 19:45:20

+0

你在填充矢量嗎?這將有助於看到該代碼。就像這樣,你似乎在排序一個空矢量。 – 2011-02-07 19:45:24

+0

@Fred:是的,我正在填充矢量。 – ajmartin 2011-02-07 19:56:59

回答

6

我現身說法使用std::sort的答案一致。但暫時忽略這一點,我認爲你的問題的原因是你傳遞的是對象的地址,而不是向量的內容。試試這個:

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

然後在你嘗試之後,回去並用std::sort代替。 8v)

3

使用標準::排序從algorithm。它很容易使用,類型安全,比qsort更快並且沒有指針問題:)。

#include <algorithm> 

inline bool comparisonFuncion(item * lhs,item * rhs) 
{ 
    return lhs->value<rhs->value; 
} 

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

`lhs`和`rhs`不是指針(所以你會有一個語法錯誤),但它們需要匹配向量的內容。 – 2011-02-07 19:55:24

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