このページでは

QtにおけるJavaスタイルのイテレータ

Java スタイルのイテレータ

各コンテナクラスには、Java スタイルのイテレータデータ型が 2 つ用意されています。1 つは読み取り専用アクセスを提供し、もう 1 つは読み書きアクセスを提供します。

注:新しい コードでは、STL スタイルのイテレータを使用することをお勧めします。STL スタイルのイテレータは効率が高く、Qt XML および STL の `generic algorithms` と併用できるためです。

コンテナ読み取り専用イテレータ読み書き可能なイテレータ
QList<T>,QQueue<T>,QStack<T>,QListIterator<T>QMutableListIterator<T>
QSet<T>QSetIterator<T>QMutableSetIterator<T>
QMap<Key, T>,QMultiMap<Key, T>QMapIterator<Key, T>QMutableMapIterator<Key, T>
QHash<Key, T>,QMultiHash<Key, T>QHashIterator<Key, T>QMutableHashIterator<Key, T>

この解説では、QList およびQMap に焦点を当てます。QSet のイテレータ型は、QList のイテレータとまったく同じインターフェースを持っています。同様に、QHash のイテレータ型は、QMap のイテレータと同じインターフェースを持っています。

STLスタイルのイテレータとは異なり、Javaスタイルのイテレータは、要素を直接指すのではなく、要素間の位置を指します。このため、イテレータはコンテナの先頭(最初の要素の前)、コンテナの末尾(最後の要素の後)、あるいは2つの要素の間のいずれかを指すことになります。 以下の図は、4つの要素を含むリストについて、有効なイテレータの位置を赤い矢印で示したものです:

項目 A、B、C、D の間のイテレータの位置

以下は、QList<QString> のすべての要素を順に反復処理するための典型的なループです:

QList<QString> list = {"A", "B", "C", "D"};

QListIterator<QString> i(list);
while (i.hasNext())
    QString s = i.next();

その動作は以下の通りです。反復処理の対象となるQList がQListIterator のコンストラクタに渡されます。その時点で、イテレータはリストの最初の項目(項目「A」の前)の直前に位置しています。 次に、hasNext() を呼び出して、イテレータの後に項目があるかどうかを確認します。ある場合は、next() を呼び出してその項目をスキップします。next() 関数は、スキップした項目を返します。QList<QString> の場合、その項目の型はQString です。

QList で後方へ反復処理を行う方法は以下の通りです:

QListIterator<QString> i(list);
i.toBack();
while (i.hasPrevious())
    QString s = i.previous();

このコードは順方向の反復処理と対称的ですが、最初にtoBack()を呼び出して、イテレータをリストの最後の項目の後に移動させる点が異なります。

以下の図は、イテレータに対してnext()およびprevious()を呼び出した際の動作を示しています:

次の項目と前の項目へ移動する

次の表は、QListIterator API の概要を示しています:

関数動作
toFront()イテレータをリストの先頭(最初の要素の前)に移動します
toBack()イテレータをリストの末尾(最後の要素の後)に移動します。
hasNext()イテレータがリストの末尾にない場合、true を返す
next()次の要素を返し、イテレータを1つ分進めます
peekNext()イテレータを移動させずに、次の要素を返す
hasPrevious()イテレータがリストの先頭でない場合、true を返す
previous()前の要素を返し、イテレータを1つ前の位置に移動させる
peekPrevious()イテレータを移動させずに、直前の要素を返します

QListIterator このイテレータには、反復処理中にリストに要素を挿入したり削除したりする関数は用意されていません。これを行うには、QMutableListIterator を使用する必要があります。以下は、QMutableListIterator を使用して、QList<int> からすべての奇数を削除する例です:

QMutableListIterator<int> i(list);
while (i.hasNext()) {
    if (i.next() % 2 != 0)
        i.remove();
}

ループ内の next() の呼び出しは毎回行われます。これにより、リストの次の項目にスキップします。remove() 関数は、スキップした直前の項目をリストから削除します。remove() の呼び出しはイテレータを無効化しないため、引き続き安全に使用できます。これは逆順に反復する場合にも同様に機能します:

QMutableListIterator<int> i(list);
i.toBack();
while (i.hasPrevious()) {
    if (i.previous() % 2 != 0)
        i.remove();
}

既存の要素の値を変更したいだけなら、setValue() を使用できます。以下のコードでは、128より大きい値をすべて128に置き換えています:

QMutableListIterator<int> i(list);
while (i.hasNext()) {
    if (i.next() > 128)
        i.setValue(128);
}

remove() と同様に、setValue() は、スキップした直後の項目に対して操作を行います。順方向に反復する場合、これはイテレータの直前の項目になります。逆方向に反復する場合、これはイテレータの直後の項目になります。

next() 関数は、リスト内の要素への非const参照を返します。単純な操作であれば、setValue() を使う必要すらありません:

QMutableListIterator<int> i(list);
while (i.hasNext())
    i.next() *= 2;

前述の通り、QSet のイテレータクラスは、QList のイテレータクラスとまったく同じAPIを持っています。次に、QMapIterator について見ていきます。これは(キー、値)のペアを反復処理するため、多少異なります。

QListIterator と同様に、QMapIterator もtoFront()、toBack()、hasNext()、next()、peekNext()、hasPrevious()、previous()、およびpeekPrevious()を提供しています。キーと値のコンポーネントは、next()、peekNext()、previous()、またはpeekPrevious()によって返されるオブジェクトに対して、key()およびvalue()を呼び出すことで抽出されます。

次の例は、首都の名前が「City」で終わるすべての (首都, 国) のペアを削除します:

QMap<QString, QString> map = {
    {"Paris", "France"},
    {"Guatemala City", "Guatemala"},
    {"Mexico City", "Mexico"},
    {"Moscow", "Russia"}
};
//...

QMutableMapIterator<QString, QString> i(map);
while (i.hasNext()) {
    if (i.next().key().endsWith("City"))
        i.remove();
}

QMapIterator また、イテレータに対して直接操作を行い、イテレータがスキップした直前の項目のキーと値を返す、key() およびvalue() 関数も提供されています。たとえば、次のコードはQMap の内容をQHash にコピーします:

QMap<int, QWidget *> map;
QHash<int, QWidget *> hash;

QMapIterator<int, QWidget *> i(map);
while (i.hasNext()) {
    i.next();
    hash.insert(i.key(), i.value());
}

同じ値を持つすべての項目を反復処理したい場合は、findNext() またはfindPrevious() を使用できます。以下は、特定の値を持つすべての項目を削除する例です:

QMutableMapIterator<int, QWidget *> i(map);
while (i.findNext(widget))
    i.remove();

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.