2012年1月18日水曜日

( Qt C++ )QHashを使用する


はい、それではQHashを使っていきます。

C++にもコンテナクラスは用意されていますがQtを使うならQtのコンテナクラスを使用したほうがよさそうです。なぜなら

①各プラットフォームで同じ動作を保証できる
②コピーオンライトであること

というメリットがあるからです。(C++ GUI Programming with Qt4 251ページより)

それで今回使うQHashですが、ざっくり言うと"連想コンテナ"です。キーと値を要素をソートせずにハッシュテーブルに格納するものでQMapより検索速度が速いという特徴があります。(リファレンス

サンプルは独自のものを使用します。
そして、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではさっそくコードを

(mainwindow.cpp)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//ui部にはGUI部品について書かれています。
{
    ui->setupUi(this);//uiのGUI部品初期化

    QHash<int, QString> hash;//keyはint, valueはQString
    hash[0] = "Zero!";//キーを0,値に"Zero!"をセット
    hash[1] = "One!";
    hash.insert(2, "Two!");//キーを2,値に"Two!"をセット

    ui->label->setText(hash[2]+ hash.value(1) + hash.value(0));
}

はい簡単ですね。ui部についてはQHashの理解には関係ないので無視して構いません。流れはキーはint, 値はQStringとした空のQHashを宣言し、それぞれセットしQLabelに値を表示しています。セットと表示ともに2通りのアクセス方法で記述して います。どちらも意味的には同じですので好きなほうを選んでください。

なお、注意すべき点は[ ]内は要素の位置ではなく、キーを指すということです。たとえば以下のようにQStringがキーとなっている場合は

//キー、値共にQString
QHash<QString, QString> hash;

hash["key1"] = "Zero!";

のようにキーを[ ]内に記述しなければなりません。配列のようなアクセスの仕方ではないということに注意しなければなりません。

また、QHashもJava,STL両スタイルのイテレータを使用できます。以下のような感じで記述できます。
(Javaスタイルについてはこちら  STLスタイルについてはこちら

(STLスタイルイテレータの使用例)
QString temp;
QHash<int, QString>::const_iterator i = hash.constBegin();
while (i != hash.constEnd()) {
    temp += tr("%1 : %2  ").arg(i.key()).arg(i.value());
    ++i;
}

その他詳細はリファレンスを確認してください。

上記mainwindow.cppを実行すると以下のようになります。


以上です。