Подтвердить что ты не робот

Почему программисты С++ используют!= Вместо <

В С++ primer, pg 95 автор говорит, что программисты на С++ склонны использовать!= в предпочтении < при записи петель.

for (vector<int>::size_type i = 0; i != 10; ++i) is preferred instead of 
for (vector<int>::size_type i = 0; i < 10; ++i) 

Я читал то же самое в ускоренном С++. Может кто-нибудь объяснить обоснование этого

4b9b3361

Ответ 1

При использовании некоторых типов итераторов STL (тех, которые не являются произвольным доступом) вы должны использовать !=:

for (map<int,int>::iterator i = a.begin(); i != a.end(); ++i) ...

Однако я не вижу причин предпочитать != для хорошо упорядоченных скалярных типов, как в вашем примере. Обычно я предпочитаю < для скалярных типов и != для всех типов итераторов.

Ответ 2

Это привычка к родовому программированию; например, вы можете легко использовать < с индексами, но вы не можете использовать это со всеми типами итераторов. Итератор списка не может эффективно реализовать < - однако != может быть реализован даже для самых простых типов итераторов. Поэтому хорошая привычка всегда использовать наиболее общее сравнение - это делает ваш код более устойчивым к изменению.

Ответ 3

Подумайте о том, когда нужно увеличивать, давайте скажем 3 вместо 1.

for (vector<int>::size_type i = 0; i != 10; i+=3)

Это будет работать вечно, так как он пропустит 10 и перейдет на 12 и увеличится навсегда.

for (vector<int>::size_type i = 0; i < 10; i+=3) 

В этом случае это тоже будет хорошо. Итак!= Не всегда хороший выбор.

Ответ 4

Поскольку, в общем, не все итераторы поддерживают "<" операция. См. руководство для работы, поддерживаемого каждым типом итератора. Итераторы с произвольным доступом (из которых простые указатели являются подмножествами) поддерживают сравнения неравенств (< и > ) между итераторами

Ответ 5

Требование быть "сравнимо сопоставимым" является гораздо более сильным, чем требование "одинаково сопоставимо". Когда дело доходит до итерации по контейнерам, возможность выполнения реляционного сравнения между итераторами или общими индексами (например, <, >, <= и т.д.) Тесно связана с контейнерами с произвольным доступом, в то время как сравнение равенства больше универсальные (и часто единственные доступные при работе с контейнерами последовательного доступа).

В целом, это хорошая практика, чтобы сделать ваш код как можно более общим, т.е. вы никогда не должны полагаться на более сильные требования, когда более низкие требования совершенно достаточны. Другими словами, если вы можете реализовать свой алгоритм только с помощью сравнений равенства, лучше сделать так, не прибегая к реляционным сравнениям. Возможно, вы сделаете свой алгоритм более удобным для использования с более широким диапазоном базовых структур данных (контейнеров).

Конечно, если вы не заботитесь об этой форме или просто не нуждаетесь в ней, вы можете просто игнорировать эти соображения и использовать любой подход.

Ответ 6

Если вы пишете !=, вы можете изменить итерацию цикла с минимальными изменениями.

Предположим, что вы сначала пишете:

for ( int i = m; i != n ; i++ )

Позже вы отмените его:

for ( int i = n ; i != m ; i-- )

Не так привлекательно, но для этого требуется анализ меньше, чем "<" и " > ".

Ответ 7

Возможно, те, кто предпочитает это, потому что они привыкли проверять значение null и т.д., поэтому preffer использует то же самое!= во всем.

if(x != null) { ... }

for(int i=0; i != 10; i++) { ... }

так что для тех, кто стремится, имеет значение!= или ==

прочитайте != как РАЗНОЕ/НЕ РАВНО, следуя тому же принципу, что == EQUAL,