2012年1月22日日曜日

( Qt C++ )②ジェネリックアルゴリズムを使用する(qSort,qDeleteAll,qSwap)


はい第2回目、qSort,qDeleteAllなどのQtAlgorithms内の関数を使用していきます。

QtAlgorithmsヘッダ内にはジェネリックなアルゴリズムを実装したグローバルテンプレート関数が宣言されています。この関数を使用することにより、よりコンテナクラスの扱いが楽になります。暗記する必要はないでしょうが、何があるかぐらいは覚えておいて損はないでしょう。(リファレンス

サンプルはC++ GUI Programming with Qt4 263ページからものを少し変更し使用します。
そして、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではさっそくコードを


(QtAlgorithms : qSort)
QVector<QString> vect(3);

vect[0] = "3";
vect[1] = "2";
vect[2] = "1";

//①昇順ソート
qSort(vect.begin(), vect.end());
//②独自ソート(この場合降順ソート)
qSort(vect.begin(), vect.end(), qGreater<QString>());
まずはqSortです。コンテナ内の要素をソートします。通常は①の昇順ソートのほうを使いますが、コンテナ内の型によってはソートのやり方を変更しなければならない場合があるかと思います。
その場合は②の3つの引数を使用したほうを使います。②ではすでに定義されているqGreater関数を使用していますが、以下のような感じで独自の関数を使用できます。
//独自の比較用関数
bool Sample(const QString &str1, const QString &str1)
{
 return str1.toLower() < str2.toLower();
}

//...
qSort(list.begin(), list.end(), Sample);
またQtAlgorithmsヘッダ内にはqStableSort()というのもあります。qSort()と同じ昇順ソートですが、同じ要素の順序がそのままとなるという特徴があります。状況に応じて使い分けてください。


(QtAlgorithms : qDeleteAll)
//...
qDeleteAll(list);
list.clear();
//...

次はqDeleteAllです。コンテナの要素全てにdeleteを実行します。つまりポインタ型以外は実行の意味がありません。この関数を呼び出しただけでは要素自体は残っています。ですのでclear()で最後に全要素を削除しています。このqDeleteAllの実行だけでは要素自体は残るという点は注意してください。


(QtAlgorithms : qSwap)
QVector<QString> vect(3);

vect[0] = "3";
vect[1] = "2";
vect[2] = "1";

qSwap(vect[0], vect[2]);
//vectは最終的に[ "1", "2", "3" ]となる。

最後はqSwapです。その名のとおり値の交換です。vect[0]と[2]の値を交換しています。


その他様々な便利な関数が定義されていますので、その辺りはリファレンスを参照してみてください。

以上です。