IscanderChe26 июля 2019 г. 21:47

Про итераторы

Когда в четвёртый раз в одном месте написал нечто подобное:

QStringList list;

// наполняем list по условию, т.е. элементов там может и не оказаться

if(!list.isEmpty())
{
    foreach(QString str, list)
    {
        // обходим каждый найденный элемент
    }
}

неожиданно осознал, для чего бывают итераторы.

Не то, чтобы какое-нибудь открытие. Про итераторы я знаю. Только до сегодняшнего дня в голову не приходило их использовать. Всегда хватало foreach , или на совсем уж крайний случай for , когда надо в обработке надо опираться на идентификатор элемента списка. И получилось красивее:

QListIterator<QString> listIterator(list);

while(listIterator.hasNext())
{
    // обрабатываем элементы списка, если они есть
}

Жаль, что нельзя из итератора извлечь идентификатор элемента...

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Итераторы - это вообще не о красивом коде.

1) Что касается чистоты кода, то:

if(!list.isEmpty())
{
    foreach(QString str, list)
    {
        // обходим каждый найденный элемент
    }
}

Зачем этот if(!list.isEmpty())? - его можно безболезненно убрать в данном случае. И чем тогда будут в корне отличаться эти два фрагмента?:

while(listIterator.hasNext())
{
    // обрабатываем элементы списка, если они есть
}
// и
foreach(QString str, list)
{
  // обходим каждый найденный элемент
}

Ну а еще, есть цикл по коллекции:

for (auto value : list) {
  qDebug() << value; // тут ваш код
}

2) Итераторы бывают разные. Дальше я пишу про стандартный С++, а не Qt.
По категориям: входные, выходные, прямые, двунаправленные и произольного доступа.
Итераторы каждой категории могут быть прямыми/реверсивными и константными/неконстантными.
Итого 20 видов итераторов.

Зачем это нужно?: В первую очередь (но не только), для работы алгоритмов (которые в std::algorithm). Например, функция std::sort применима ТОЛЬКО к контенерам, для которых определены итераторы произвольного доступа. Поэтому к вектору ее можно применять, а к list - нельзя.

3) >> Жаль, что нельзя из итератора извлечь идентификатор элемента...
Невозможно даже представить себе такое. Итераторы не для этого.

По п.1 - есть такое дело, сразу не сообразил.
По всем трём пунктам - приложили.)) Спасибо!

Про алгоритмы я тоже вспомнил в связи со своей задачей.

За цикл по коллекции - отдельное спасибо. Я про него забыл. Надо "Программирование. Принципы и практика с использованием C++" Страуструпа перечитать.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Card image cap
Pulsum Via

Проект для путешественников от EVILEG.

Перейти
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
Поделиться в социальных сетях
Donate

Проект EVILEG перешёл на некоммерческую основу и будет развиваться исключительно на энтузиазме создателя сайта, энтузиазме пользователей, пожертвованиях и реферальной системе хостинга

Спасибо за вашу поддержку

Доступные способы поддержки проекта

PayPal

PatreonYooMoneyПодробнее
M

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
k

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
k

C++ - Тест 002. Константы

  • Результат:58баллов,
  • Очки рейтинга-2
Последние комментарии
Ds

Android и QML - Добавление Splash Screen

Интересен формат иконки, если это png, то как решается проблема scalability? не растягивается ли лого на китайфонах с 1280х2500? У меня просто сплеш скрин с градиентом и логотипом, и вот несколь…
p

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

FIGURE Abdominopelvic regions. Zjuaqd https://newfasttadalafil.com/ - Cialis Cialis Recommendations for preparing children and adolescents for invasive cardiac procedures a statement…
КГ

Как использовать вложенные формы в Django

Спасибо за полезную статью. Подскажите пожалуйста, что делать если нужно реализовать большее количество вложенных форм? Например если на модель Address ссылается fk другой модели, на котору…

Qt/C++ - Урок 051. QMediaPlayer - Аудио плеер на Qt

Не думаю, QMediaPlayer в один поток проигрывает. Если вам нужно одновременное воспроизведение нескольких аудиоисточников, то вам нужна Bass audio library , насколько знаю, её обычно и…
АГ

Qt/C++ - Урок 051. QMediaPlayer - Аудио плеер на Qt

есть такая вообще возможность ?
Сейчас обсуждают на форуме
АБ

Sorting the added QML elements in the ListModel

I am writing an alarm clock in QML, I am required to sort the alarms in ascending order (depending on the date or time (if there are several alarms on the same day). I've done the sorting …

Изменение поведения QGroupBox при клике на его чекбокс

Я вынес виджеты вынес за пределы QGroupBox в итоге.

QSqlRelatipnalTabelModel Qt 4.8.1 как получить id внешней связи?

Есть еще принципиально другой вариант решить раз и навсегда вопрос с полей id внешней связи. Это форкнуть Qt 4.8.1 QSqlTableModel, то есть создать свою ветку развития. Например создадим кл…

Добавление AndroidManifest.xml в cmake

Добрый день. Как добавить AndroidManifest.xml в cmake? Это не работвет set(ANDROID_PACKAGE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/android CACHE INTERNAL "")set(ANDROID_BUID_DIR ${CMAKE_C…
s

Событие wheelEvent для виджета QLineEdit

вот что получилось: gui.py from PyQt5 import QtCore, QtGui, QtWidgets class LineEdit(QtWidgets.QLineEdit): def wheelEvent(self, event): #print("_") delta = 1 if e…
О нас
Услуги
© EVILEG 2015-2022
Рекомендует хостинг TIMEWEB