Во всех до сих пор рассмотренных контейнерах тип элемента
Тип
QList
Кроме только что упомянутых типов в качестве типа элементов контейнера может задаваться любой пользовательский класс, отвечающий описанным ранее критериям. Ниже дается пример такого класса:
01 class Movie
02 {
03 public:
04 Movie(const QString &title = "", int duration = 0);
05 void setTitle(const QString &title) { myTitle = title; }
06 QString title const { return myTitle; }
07 void setDuration(int duration) { myDuration = duration; }
08 QString duration const { return myDuration; }
09 private:
10 QString myTitle;
11 int myDuration;
12 };
Этот класс имеет конструктор, для которого необязательно указывать аргументы (хотя он может иметь до двух аргументов). Он также имеет конструктор копирования и оператор присваивания, которые обеспечиваются С++ по умолчанию. В этом классе достаточно обеспечить копирование между его членами, поэтому нам нет необходимости реализовывать свои собственные конструктор копирования и оператор присваивания.
Qt имеет две категории итераторов, используемых для прохода по элементам контейнера: итераторы в стиле Java и итераторы в стиле STL. Итераторами в стиле Java легче пользоваться, в то время как итераторы в стиле STL более мощные и могут использоваться совместно с алгоритмами Qt и STL.
С каждым классом—контейнером могут использоваться два типа итераторов в стиле Java: итератор, используемый только для чтения, и итератор, используемый как для чтения, так и для записи. Классами итераторов первого типа являются
Прежде всего следует иметь в виду, что итераторы в стиле Java не ссылаются непосредственно на элементы. Вместо этого они могут указывать на позицию перед первым элементом, после последнего элемента или между двумя элементами. Обычно организованный с их помощью цикл выглядит следующим образом:
QList
…
QListIterator
while (i.hasNext) {
do_something(i.next);
}
Итератор инициализируется контейнером, для прохода по которому он будет использован. В этот момент итератор располагается непосредственно перед первым элементом. Вызов функции
Проход в обратном направлении выполняется аналогично, с тем отличием, что сначала вызывается функция
QListIterator
i.toBack;
while (i.hasPrevious) {
do_something(i.previous);
}
Функция