2012年1月21日土曜日

( Qt C++ )①ジェネリックアルゴリズムを使用する(qFind,qFill,qCopy)


はい今回から2回に分けてqFind,qFillなどのコンテナクラスを扱う上で便利なQtAlgorithms内の関数を使用していきます。

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

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

(QtAlgorithms : qFind)
QStringList list;
list << "Zero" << "One" << "Two" << "Three";

QStringList::Iterator i = qFind(list.begin(), list.end(), "Two");
*i = "Ni";
//listは最終的に[ "Zero", "One", "Ni", "Three" ]となる。

まず最初はqFindです。その名の通りコンテナ内の値の検索ができます。第1引数に開始位置。第2引数に終了位置を指定し、第3引数に検索する値を指定します。返されるイテレータはSTLスタイルイテレータです。
qFind()と似たものにqBinaryFind()があります。この関数を使用するにはコンテナが昇順でソートされている必要がありますがqFindより高速に検索できる利点があるそうです。


(QtAlgorithms : qFill)
QStringList list;
list << "1" << "2" << "3";

qFill(list.begin(), list.end(), "Same");
//listは最終的に[ "Same", "Same", "Same" ]となる。

次はqFillです。コンテナ内の指定した分の要素を全て指定した値に変更できます。第1引数に開始位置。第2引数に終了位置を指定し、第3引数に置換する値を指定します。


(QtAlgorithms : qCopy)
QVector<QString> vect(3);
QVector<QString> vect2(vect.count());

vect[0] = "One";
vect[1] = "Two";
vect[2] = "Three";

qCopy(vect.begin(), vect.end(), vect2.begin());

次はqCopyです。コンテナ内の要素を別のコンテナにコピーします。また、同じコンテナの要素であっても要素の範囲がかぶってなければコピーできます。以下のような感じです。
QVector<QString> vect(3);
vect[0] = "One";
vect[1] = "Two";
vect[2] = "Three";
qCopy(vect.begin(), vect.begin() + 1, vect.end() - 1);
//vectは最終的に[ "One", "Two", "One" ]となる。
qCopyは第1引数に開始位置。第2引数に終了位置を指定し、第3引数に書き込み先の書き込み開始位置を指定します。


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

以上です。