Коли вчетверте в одному місці написав щось подібне:
QStringList list; // наполняем list по условию, т.е. элементов там может и не оказаться if(!list.isEmpty()) { foreach(QString str, list) { // обходим каждый найденный элемент } }
несподівано усвідомив, навіщо бувають ітератори.
Не те, щоб якесь відкриття. Про ітератори я знаю. Тільки до сьогоднішнього дня на думку не спадало їх використовувати. Завжди вистачало foreach , або на зовсім крайній випадок for , коли треба в обробці спиратися на ідентифікатор елемента списку. І вийшло красивіше:
QListIterator<QString> listIterator(list); while(listIterator.hasNext()) { // обрабатываем элементы списка, если они есть }
Жаль, що не можна з ітератора витягти ідентифікатор елемента.
Итераторы - это вообще не о красивом коде.
1) Что касается чистоты кода, то:
Зачем этот if(!list.isEmpty())? - его можно безболезненно убрать в данном случае. И чем тогда будут в корне отличаться эти два фрагмента?:
Ну а еще, есть цикл по коллекции:
2) Итераторы бывают разные. Дальше я пишу про стандартный С++, а не Qt.
По категориям: входные, выходные, прямые, двунаправленные и произольного доступа.
Итераторы каждой категории могут быть прямыми/реверсивными и константными/неконстантными.
Итого 20 видов итераторов.
Зачем это нужно?: В первую очередь (но не только), для работы алгоритмов (которые в std::algorithm). Например, функция std::sort применима ТОЛЬКО к контенерам, для которых определены итераторы произвольного доступа. Поэтому к вектору ее можно применять, а к list - нельзя.
3) >> Жаль, что нельзя из итератора извлечь идентификатор элемента...
Невозможно даже представить себе такое. Итераторы не для этого.
По п.1 - есть такое дело, сразу не сообразил.
По всем трём пунктам - приложили.)) Спасибо!
Про алгоритмы я тоже вспомнил в связи со своей задачей.
За цикл по коллекции - отдельное спасибо. Я про него забыл. Надо "Программирование. Принципы и практика с использованием C++" Страуструпа перечитать.