Итераторы против индекса на основе циклов в Qt - PullRequest
4 голосов
/ 02 февраля 2011

По этой причине итераторы редко используются в связи с QList.Единственное место, где итераторы в стиле STL имеют смысл - это аргументы для универсального

http://doc.qt.digia.com/4.2/qlist-iterator.html

Так что, если у меня есть цикл for, где макрос foreach не подходит,Должен ли я использовать итераторы или индексы?

  for(int i = 0; i < list.size(); i++) {

       Do something with list[i]

       blah blah blah

  }



  for(QList<type>::iterator i = list.begin(); i != list.end(); ++i) {

          Do something with *i

          blah blah blah

  }

Ответы [ 4 ]

3 голосов
/ 03 февраля 2011

Qt имеет свой собственный макрос foreach. Я также не могу придумать причину, почему foreach не вариант ...

Самым важным отличием является необходимость изменения содержимого списка в цикле, так как это может затруднить чтение с помощью API индекса.

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

  1. Используйте foreach с (const-) ссылочным типом, и пусть фреймворк делает правильные вещи
  2. Использовать индекс api :: at (int) (Цитата из 4.7 документа: "QList реализован таким образом, что прямой доступ на основе индекса так же быстр, как использование итераторов" & "at () может быть быстрее, чем оператор [] "
  3. Использовать API итератора

Но на самом деле это просто вопрос стиля. Если это так критично для производительности, что вам нужно беспокоиться о незначительных различиях, вам следует подумать о редизайне или написании собственного специализированного списка.

2 голосов
/ 02 февраля 2011

Я бы также подумал, какое снижение производительности может быть между двумя версиями. Постоянно вычислять список [i] гораздо дороже, чем вычислять ++ i один раз. Если вы действительно хотите использовать индексную нотацию и не понести слишком большой потери производительности, я предлагаю добавить туда ссылку для хранения вещей.

for(int i = 0; i < list.size(); ++i) {

   ListItem &list_item = list[i];

   // do something with list_item
}

[Я бы также использовал ++ i вместо i ++, поскольку это, как правило, быстрее, как правило.]

2 голосов
/ 02 февраля 2011

Я думаю, что это зависит от того, что на самом деле делает "бла-бла-бла", но обычно я выбираю последнюю форму в сочетании с функцией std::foreach, но я полагаю, что это только вопрос вкуса.

Кстати, вы имеете в виду std::foreach когда вы пишете макрос foreach?Если это так, обратите внимание на то, что это не макрос.

1 голос
/ 02 февраля 2011

В этом конкретном примере большой разницы нет.

Кроме того, всегда полезно учиться с использованием итераторов типа stl, но они особенно полезны, когда вы начинаете изучать алгоритмы stl, как, например, foreach. Но не останавливайтесь на достигнутом - определенно выберите transform, sort, remove_copy_if и многие другие.

В конце концов, они являются частью стандартной библиотеки!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...