はいそれでは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を実行すると以下のようになります。