IscanderCheJuly 26, 2019, 11:47 a.m.

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

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

QStringList list;

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

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

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

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

QListIterator<QString> listIterator(list);

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

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

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

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++" Страуструпа перечитать.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
VSh

C++ - Тест 003. Условия и циклы

  • Result:71points,
  • Rating points1
S
  • Sergej
  • Sept. 6, 2020, 1:50 a.m.

Qt - Test 001. Signals and slots

  • Result:100points,
  • Rating points10
S
  • Sergej
  • Sept. 6, 2020, 1:48 a.m.

Qt - Test 001. Signals and slots

  • Result:94points,
  • Rating points8
Last comments
VB

Qt/C++ - Lesson 004. QSqlTableModel – How to present the table from database?

Почему-то такой метод для обновления не работает, который можно было бы применить в данном примере. То есть в представлении данные удаляются и обновляются, а в базе данных изменений не происходи…
DI

Qt/C++ - Lesson 015. QTableWidget – How to create a table with checkboxes?

Кажется я понял в чем ошибка - я вручную создал таблицу Device в базе данных DataBase.db через DB Browser for SQLite в корне проекта с соответствующими типами данных и по какой-то причине insert…
DI

Qt/C++ - Lesson 015. QTableWidget – How to create a table with checkboxes?

Да, у меня тоже такая мысль возникла, но я просто скопипастил этот код из статьи, ничего в нем не меняя.

Qt/C++ - Lesson 015. QTableWidget – How to create a table with checkboxes?

Пока добавляли у себя код, что-то пробовали проверяли, могло дойти до ситуации, когда у вас получилась создана таблица, с количеством колонок, не совпадающим с количеством колонок в финальной ве…
DI

Qt/C++ - Lesson 015. QTableWidget – How to create a table with checkboxes?

Попробовал запустить код, описанный в данной статье, но получаю следующее: Подскажите в чем может быть проблема ? Вывод окна - пустой:
Now discuss on the forum
U

Как в qml работать с динамически созданными потомками?

Приветствую, уже полюбившийся форум) Есть у меня Item{id: _window}, в который я по нажатию кнопки создаю объекты: myComponent = Qt.createComponent(paletteItem.componentFile); myC…
U

Помогите сделать наследованый класс MenuElements от класса Menu

Я может что-то не совсем понял... Но наследовать элементы меню от самого меню - верное решение логически? Наследование нужно, чтобы в итоге получился класс, который будет иметь всё то же с…
KM

не знаю что писать в cpp

почти Actionn::Actionn(const QString& name, QWidget *parent) : //lista inicjalizacyjna MenuElement(name,parent), QWidget(parent), ui(new Ui::Actionn) вдруг кто то мучался к…

не могу передать стринг с QLineEdit

QLineEdit *myLineEdit = new QLineEdit("line edit name", this); QString str = myLineEdit->text();

QSqlTableModel не удаётся редактировать и удалять данные

Если через раз, то дело скорее всего в том, что обычно ID является автоинкрементируемым столбцом, который всегда растёт, даже если какие-то строки удалялись из базы данных. Если у вас было 4 зап…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB