2012年1月17日火曜日

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


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

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

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

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

それで今日使うQMapですが、ざっくりいうと"連想コンテナ"です。
スキップリストで実装されており、キーと値をペアで昇順ソートして格納するという特徴があります。

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

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

    QMap<int, QString> map;//キーはint, 値はQString
    
    map[0] = "Zero!";//キーを0,値に"Zero!"をセット
    map[1] = "One!";
    map.insert(2, "Two!");//キーを2,値に"Two!"をセット
    
    ui->label->setText(map[2] + map.value(1) + map.value(0));
}

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

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

//キー、値共にQString
QMap<QString, QString> map;

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

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

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

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

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

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


以上です。