2012年1月19日木曜日

( Qt C++ )QMultiMap,QMultiHashを使う


はいそれではQMultiMap,QMultiHashを使っていきます。

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

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

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

それで今日使うQMultiMap,QMultiHashですが、ざっくりいうと"同じキーを使える連想コンテナ"みたいなものです。ともにそれぞれQMap,QHashのサブクラスで、同じキーを使い値を格納できるという特徴があります。(QMultiMap)(QMultiHash

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

(mainwindows.cpp  QMultiMapの場合)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//ui部にはGUI部品について書かれています。
{
    ui->setupUi(this);//uiのGUI部品初期化
    
    QMultiMap<int, QString> mMap;//keyはint, valueはQString
    
    mMap.insert(1, "Zero!");//キーは1 値は"Zero!"
    mMap.insert(1, "One!");//キーは1 値は"One!"
    mMap.insert(1, "Two!");//キーは1 値は"Two!"
    
    QList<QString> list = mMap.values(1);//キーが1の値を全てリストで返す

    //QLabelに表示
    ui->label->setText(list[0] + list.value(1) + list.value(2));
}

(mainwindows.cpp  QMultiHashの場合)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//ui部にはGUI部品について書かれています。
{
    ui->setupUi(this);//uiのGUI部品初期化
    
    QMultiHash<int, QString> mHash;//keyはint, valueはQString

    mHash.insert(1, "Zero!");//キーは1 値は"Zero!"
    mHash.insert(1, "One!");//キーは1 値は"One!"
    mHash.insert(1, "Two!");//キーは1 値は"Two!"

    QList<QString> list = mHash.values(1);//キーが1の値を全てリストで返す

    //QLabelに表示
    ui->label->setText(list[0] + list.value(1) + list.value(2));

はいQMultiMap,QMultiHash共に使用方法は同じです。もちろんやってることも結果も同じです。

[ ]による要素のアクセスが出来なくなっています。要素の挿入はinsertのみです。要素の取り出しはvalue,values,イテレータなどを使って取り出す形となります。
valueを使った場合は引数のキーに対応する最後に挿入した値しか返りませんので同じキーで他の値を取り出すには使えません。同じキーの様々の値を取り出す必要がある場合はvaluesでリストとして返してもらうかイテレータを使って取り出す必要があります。

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

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

その他詳細は各リファレンスを参照してください。
QMultiMap)(QMultiHash


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

以上です。