2011-02-07 4 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; 
} 

、有効な場所へのポインタpapbポイントでもないし。 class itemsのすべてのデータメンバーのセットは、paまたはpbのいずれかで指し示されていますが、ガベージ値が含まれています。私はどこでミスをしていますか?私はダブルポインタの使用についても特定していません。

ありがとうございました。

+4

なぜあなたはqsortを使用していますか? –

+0

ベクターにデータを設定していますか?それはそのコードを見るのに役立ちます。それは空のベクトルをソートしているようです。 –

+0

@Fred:はい私はベクトルに値を設定しています。 – ajmartin

答えて

6

私はstd::sortを使用して助言する答えに同意します。しかし、それを無視して、私はあなたの問題の理由は、あなたがベクトルの内容ではなく、vectorオブジェクトのアドレスを渡しているということだと思います。これを試してみてください:

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

それを試した後、代わりにstd::sortを使用してください。 8v)

+0

これは働いた。ありがとう。 – ajmartin

+1

@ajmartin:クール。しかし、あなたは 'std :: sort'の使い方について助言して欲しいと思います。よりクリーンで、簡単で、エラーを起こしにくいです。関数オブジェクトと共に使用すると、より高速になる可能性があります。コンパイラはインライン化を利用することができます。インライン化は、関数ポインタのアプローチではできません。 –

+1

アドバイスを取って実装しました。ありがとう:) – ajmartin

3

std :: sortを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'はポインタではないので(構文エラーがあります)、ベクトルの内容と一致する必要があります。 –

+0

@Fred Larson関数 '.'を' - > 'に変更しましたが、ポインタへの参照を変更するのを忘れました。指していただきありがとうございます:) – UmmaGumma

4

ではなくstd::sortを使用し、C++でqsortを使用しないでください:

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

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

この外観はすっきりしていなければなりません。ありがとう – ajmartin

関連する問題