< (меньше) или != (не равно) в цикле for?

Какой тип цикла в обобщённом коде выбрать?

for (auto i = first; i < last; ++i) {   
    // ...
}

for (auto i = first; i != last; ++i) {   
    // ...
}

CppCoreGuidelines говорит, что второй, но практически всегда встречаю первый.


Ответы (2 шт):

Автор решения: Harry

Если работаете с индексами - то все равно, первый в определенном смысле предпочтительнее (вдруг в цикле нужно будет i увеличить дополнительно и появится шанс "проскочить" last :)).

Но если с итераторами — то очевидно, что второй.

"По-моему, так" (с) Пух

→ Ссылка
Автор решения: KoVadim

CppCoreGuidelines говорит, что второй вариант более generic (а если написано generic, читаем "шаблоны" :) ). Очень легко увидеть, что если есть какой-то связанный список, то операцию равно-не равно легко определить, а вот больше-меньше - сложно. Это и есть причиной такой рекомендации.

Там же написано

Of course, range-for is better

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

Но для простого пользовательского кода (особенно, если там int) я бы не использовал != - нужно обязательно сделать дополнительную проверку на first <= last.

В своей практике я видел код, который использует != и он иногда приводил к багам... И вот самый красивый (в оригинале он был немного красивее)

unsigned int last = get_last();
for (unsigned int i = 0; i != last; i+=2) {
  //..
}
→ Ссылка