iterator Class

  • Header: iterator

  • qmake: QT += core

Detailed Description

QLinkedList features both STL-style iterators and Java-style iterators. The STL-style iterators are more low-level and more cumbersome to use; on the other hand, they are slightly faster and, for developers who already know STL, have the advantage of familiarity.

QLinkedList<T>::iterator allows you to iterate over a QLinkedList<T> and to modify the list item associated with the iterator. If you want to iterate over a const QLinkedList, use QLinkedList::const_iterator instead. It is generally good practice to use QLinkedList::const_iterator on a non-const QLinkedList as well, unless you need to change the QLinkedList through the iterator. Const iterators are slightly faster, and can improve code readability.

The default QLinkedList::iterator constructor creates an uninitialized iterator. You must initialize it using a function like QLinkedList::begin(), QLinkedList::end(), or QLinkedList::insert() before you can start iterating. Here's a typical loop that prints all the items stored in a list:

 
Sélectionnez
QLinkedList&lt;QString&gt; list;
list.append("January");
list.append("February");
...
list.append("December");

QLinkedList&lt;QString&gt;::iterator i;
for (i = list.begin(); i != list.end(); ++i)
    cout &lt;&lt; *i &lt;&lt; endl;

STL-style iterators can be used as arguments to generic algorithms. For example, here's how to find an item in the list using the qFind() algorithm:

 
Sélectionnez
QLinkedList&lt;QString&gt; list;
...
QLinkedList&lt;QString&gt;::iterator it = qFind(list.begin(),
                                          list.end(), "Joel");
if (it != list.end())
    cout &lt;&lt; "Found Joel" &lt;&lt; endl;

Let's see a few examples of things we can do with a QLinkedList::iterator that we cannot do with a QLinkedList::const_iterator. Here's an example that increments every value stored in a QLinkedList<int> by 2:

 
Sélectionnez
QLinkedList&lt;int&gt;::iterator i;
for (i = list.begin(); i != list.end(); ++i)
    *i += 2;

Here's an example that removes all the items that start with an underscore character in a QLinkedList<QString>:

 
Sélectionnez
QLinkedList&lt;QString&gt; list;
...
QLinkedList&lt;QString&gt;::iterator i = list.begin();
while (i != list.end()) {
    if ((*i).startsWith('_'))
        i = list.erase(i);
    else
        ++i;
}

The call to QLinkedList::erase() removes the item pointed to by the iterator from the list, and returns an iterator to the next item. Here's another way of removing an item while iterating: