C ++ итератор для ловушек цикла? - PullRequest
9 голосов
/ 22 июня 2010

Я вижу, где-то там упоминается:

for ( itr = files.begin(); itr < files.end(); ++itr )  // WRONG
for ( itr = files.begin(); itr != files.end(); ++itr ) // ok

Почему первое выражение неверно?Я всегда использовал первое выражение, и у меня не было проблем.

Ответы [ 3 ]

21 голосов
/ 22 июня 2010

Сравнения порядка, такие как <, >, <=, >=, будут работать для итераторов с произвольным доступом, но многие другие итераторы (такие как двунаправленные итераторы в связанных списках) поддерживают только проверку на равенство (== и !=).Используя !=, вы можете позже заменить контейнер без необходимости изменять как можно больше кода, и это особенно важно для кода шаблона, который должен работать со многими различными типами контейнеров.

7 голосов
/ 22 июня 2010

Существуют разные типы итераторов.Только итераторы с произвольным доступом поддерживают оператор <.Другие типы итераторов (двунаправленные, входные, выходные и пр.) - нет.Но все итераторы поддерживают операторы == и !=.Поэтому ваш код будет работать со всеми типами итераторов, если вы используете !=.

5 голосов
/ 22 июня 2010

Первый работает только для итераторов, которые поддерживают operator <, что не все итераторы делают.

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