IscanderChe
July 26, 2019, 9:47 p.m.

About iterators

When for the fourth time in one place I wrote something like this:

  1. QStringList list;
  2.  
  3. // наполняем list по условию, т.е. элементов там может и не оказаться
  4.  
  5. if(!list.isEmpty())
  6. {
  7. foreach(QString str, list)
  8. {
  9. // обходим каждый найденный элемент
  10. }
  11. }

suddenly realized what iterators are for.

Not that it's some kind of discovery. I know about iterators. Until today it never occurred to me to use them. foreach was always enough, or in the very extreme case of for , when it is necessary to rely on the identifier of the list element in processing. And it turned out more beautiful:

  1. QListIterator<QString> listIterator(list);
  2.  
  3. while(listIterator.hasNext())
  4. {
  5. // обрабатываем элементы списка, если они есть
  6. }

It's a pity that you can't extract the element ID from an iterator...

By article asked0question(s)

3

Do you like it? Share on social networks!

Vladimir Sergeevich
  • July 27, 2019, 11:37 a.m.

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

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

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

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

  1. while(listIterator.hasNext())
  2. {
  3. // обрабатываем элементы списка, если они есть
  4. }
  5. // и
  6. foreach(QString str, list)
  7. {
  8. // обходим каждый найденный элемент
  9. }

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

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

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

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

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

IscanderChe
  • July 27, 2019, 1:23 p.m.

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

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • AK
    April 1, 2025, 11:41 a.m.
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup