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:
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:
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:
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>:
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: