< (меньше) или != (не равно) в цикле for?
Какой тип цикла в обобщённом коде выбрать?
for (auto i = first; i < last; ++i) {
// ...
}
for (auto i = first; i != last; ++i) {
// ...
}
CppCoreGuidelines говорит, что второй, но практически всегда встречаю первый.
Ответы (2 шт):
Если работаете с индексами - то все равно, первый в определенном смысле предпочтительнее (вдруг в цикле нужно будет i увеличить дополнительно и появится шанс "проскочить" last :)).
Но если с итераторами — то очевидно, что второй.
"По-моему, так" (с) Пух
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) {
//..
}