Qt의 Java 스타일 이터레이터

Java 스타일 이터레이터

각 컨테이너 클래스에는 읽기 전용 액세스를 제공하는 것과 읽기-쓰기 액세스를 제공하는 두 가지 Java 스타일 이터레이터 데이터 유형이 있습니다.

참고: 새 코드는 더 효율적이고 Qt 및 STL의 generic algorithms 와 함께 사용할 수 있는 STL 스타일 이터레이터를 사용해야 합니다.

컨테이너읽기 전용 이터레이터읽기-쓰기 이터레이터
QList<t>, QQueue<t>, QStack<t>,QListIterator<T>QMutableListIterator<T>
QSet<T>QSetIterator<T>QMutableSetIterator<T>
QMap<키, T>, QMultiMap<키, T>QMapIterator<키, T>QMutableMapIterator<키, T>
QHash<키, T>, QMultiHash<키, T>QHashIterator<키, T>QMutableHashIterator<키, T>

이 논의에서는 QListQMap 에 집중하겠습니다. QSet 의 이터레이터 타입은 QList 의 이터레이터와 완전히 동일한 인터페이스를 가지고 있으며, 마찬가지로 QHash 의 이터레이터 타입은 QMap 의 이터레이터와 동일한 인터페이스를 가지고 있습니다.

STL 스타일 이터레이터와 달리 Java 스타일 이터레이터는 항목을 직접 가리키지 않고 항목 사이를 가리킵니다. 따라서 컨테이너의 맨 처음(첫 번째 항목 앞), 컨테이너의 맨 끝(마지막 항목 뒤) 또는 두 항목 사이를 가리키게 됩니다. 아래 다이어그램은 4개의 항목이 포함된 목록에서 유효한 반복기 위치를 빨간색 화살표로 표시한 것입니다:

다음은 QList<QString>의 모든 요소를 순서대로 반복하는 일반적인 루프입니다:

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

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

다음과 같이 작동합니다: 반복할 QListQListIterator 생성자에게 전달됩니다. 이때 이터레이터는 목록의 첫 번째 항목 바로 앞(항목 "A" 앞)에 위치합니다. 그런 다음 hasNext()를 호출하여 이터레이터 뒤에 항목이 있는지 확인합니다. 항목이 있으면 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()다음 항목을 반환하고 이터레이터를 한 위치 전진시킵니다.
peekNext()이터레이터를 이동하지 않고 다음 항목을 반환합니다.
hasPrevious()반복자가 목록의 맨 앞에 있지 않으면 true 를 반환합니다.
previous()이전 항목을 반환하고 이터레이터를 한 위치 뒤로 이동합니다.
peekPrevious()이터레이터를 이동하지 않고 이전 항목을 반환합니다.

QListIterator 는 반복할 때 목록에서 항목을 삽입하거나 제거하는 함수를 제공하지 않습니다. 이를 수행하려면 QMutableListIterator 을 사용해야 합니다. 다음은 QMutableListIterator 을 사용하여 QList<int>에서 홀수를 모두 제거하는 예제입니다:

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

루프에서 다음() 호출은 매번 이루어집니다. 이 함수는 목록의 다음 항목으로 넘어갑니다. 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() 함수는 목록의 항목에 대한 컨스트가 아닌 참조를 반환합니다. 간단한 작업의 경우 setValue()가 필요하지 않습니다:

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

위에서 언급했듯이 QSet 의 이터레이터 클래스는 QList 의 그것과 정확히 동일한 API를 가지고 있습니다. 이제 (키, 값) 쌍을 반복하기 때문에 다소 다른 QMapIterator 으로 넘어가겠습니다.

QListIterator 와 마찬가지로 QMapIteratortoFront(), 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();

© 2025 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.