IscanderChe
Шілде 26, 2019, 9:47 Т.Қ.

Итераторлар туралы

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

QStringList list;

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

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

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

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

QListIterator<QString> listIterator(list);

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

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

Мақала бойынша сұралады0сұрақтар(лар)

3

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Vladimir Sergeevich
  • Шілде 27, 2019, 11:37 Т.Ж.

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

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) >> Жаль, что нельзя из итератора извлечь идентификатор элемента...
Невозможно даже представить себе такое. Итераторы не для этого.

IscanderChe
  • Шілде 27, 2019, 1:23 Т.Қ.

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

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

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз