2012年1月13日金曜日

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


はい今回はコンテナクラスであるQLinkedListを使います。


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

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

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

それで今日使うQLinkedListですが、ざっくりいうと "要素同士が隣接するとは限らないデータ構造" のことです。要素の挿入や削除が一定時間で行えますが、ランダムアクセスができないという特徴があります。(リファレンス

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


(mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    QLinkedList<QString> list;//空で宣言
    list.append("One!");//要素"One!"の追加
    list.append("Three!");//要素"Three!"の追加

    QLinkedList<QString>::iterator i = qFind(list.begin(), list.end(), "Three!");//"Three!"の位置を探す

    list.insert(i, "Two!");//iの位置の前に"Two!"を挿入

    QString str;
    foreach(QString s, list)//リストの全要素を取り出す
    {
        str += s;
    }

    ui->label->setText(str);
}

はい簡単ですね。ui部についてはQVectorの理解には関係ないので無視して構いません。流れはQLinkedListに要素を二つ追加し、次に要素を検索してヒットした要素の前位置に新たに要素を追加し、最後にそれらの要素をforeachで取り出しQLabelに表示するというものです。

appendで要素を追加していますが、
list << "One!" << "Three!"; のような追加もできます。好きなほうを使ってください。 qFindについてはQtAlgorithmsのリファレンス項目を見てください。

実行すると以下のようになります。
以上です。