C言語/MFC CArray を qsort する

 
 いきなりぶっとんだ話になるが、必要にメモを残しておくのだ。いずれどこかに移します。
1. CArray を qsort したかったのだよ
2. コーディングの実際

1. CArray を qsort したかったのだよ

 本項は「CArrayをqsortする | 思い立ったが吉日」を参考にさせていただきました。  MFC というか VC++ なんか使いたくないのだが、Windows の仕事をしている以上、仕方ない。  VC++ 使っていても MFC 使う必要はないんですが、これも、昔からのいきさつでしょうがない。  で、メモリを効率よく使うには、単純な配列を使って最大の領域を使うのはもったいないので CArray を使いたいのですが、qsort できないもんなと思っていたのですが、結構簡単な方法でできるんですね。

2. コーディングの実際

 うまく単純な説明ができればいいのですが・・・。
struct StructHoge
{
    int number;
};

 てな構造体があるとして

CArray <StructHoge, StructHoge> arrayHoge;

 で配列化します。

 昇順にソートするとして下記のような関数を用意しておきます。ここの比較ロジックは仕様によるものを記述するわけです。

int compareHoge(void* context, const void* a1, const void* a2)
{
    StructHoge* p1 = (StructHoge*)a1;
    StructHoge* p2 = (StructHoge*)a2;

    if (p1->number != p2->number)
    {
        return p1->number - p2->number;
    }

    return 0;
}

 qsort の呼び出しを下記のように記述すれば

    StructHoge* pHoge = arrayHoge.GetData();

    qsort_s((LPVOID)pHoge, arrayHoge.GetCount(), sizeof(StructHoge), compareHoge, NULL);

 うまいことソートできるようです。
 CArray の GetData メソッドで中身がまるまるもらえて中身書き換えて OK なんですね。知らなかった。