まあ、簡単な答えは、まったく使用std::qsort
しないことですが、std::sort
. 残念ながら、後者はunsigned int[3]
割り当て可能ではないため、機能しません。そこで、これが最も簡単なstd::qsort
解決策です。
まず、カスタム コンパレータ関数を定義します。
// return -1 if a before b, 1 if after, 0 if equal
int compare(const void *a, const void *b)
{
const unsigned int *arg1 = reinterpret_cast<const unsigned int*>(a);
const unsigned int *arg2 = reinterpret_cast<const unsigned int*>(b);
if(arg1[2] > arg2[2])
return -1;
if(arg1[2] < arg2[2])
return 1;
return 0;
}
次に、これを使用して配列をソートします。work
これは配列の配列であり、したがってwork[0]
3 の配列であることに注意してくださいunsigned int
。ポインタの間接化はまったく関係ありません。したがって、次のように並べ替えるのに最適ですstd::qsort
。
std::qsort(work, sizeof(work)/sizeof(work[0]), sizeof(work[0]), compare);
ちなみに、C++ (および他の多くのプログラミング言語) では2
通常 でカウントを開始するため、3 番目の要素は でインデックス付けされます。0
編集:std::vector
ただし、実際には、この配列の配列を削除し、 of std::array<unsigned int,3>
s (または実際のコンテキストにもう少し適合する他のデータ構造) のような C++ に適したものを使用するのが最善の解決策です。
typedef std::array<unsigned int,3> uint3;
std::vector<uint3> work(N);
次に、単純な方法でソートできます。
std::sort(std::begin(work), std::end(work),
[](const uint3 &a, const uint3 &b) { return a[2] > b[2]; });
または、C++11 を持っていない場合 (ただし、この場合はstd::array
どちらも持っていないため、単なる 3 配列とは別に、適切なデータ構造について考え始める必要があります):
struct compare
{
bool operator()(const uint3 &a, const uint3 &b) const
{
return a[2] > b[2];
}
};
std::sort(work.begin(), work.end(), compare());
より明確なコードへのボーナスとして、ほとんどの場合、パフォーマンスがわずかに向上std::sort
しstd::qsort
ます。