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

В выражении "for" я должен использовать `! =` Или `<`?

Я видел оба этих утверждения:

for(i=0;i<10;i++) 

for(i=0;i!=10;i++)

Я знаю, что все они останавливаются, когда я достигаю 10, но лучше использовать второй (я слышал). В чем разница? Я также хочу знать, когда использовать итератор для доступа к члену вектора, в чем разница между условием итератора < vec.end() и != vec.end()

4b9b3361

Ответ 1

for(i = start; i != end; ++i)

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

for(i = start; i < end; ++i)

Это не будет работать со стандартными итераторами библиотек (если только они не определены operator<), но это имеет то преимущество, что если вы по какой-то причине проходите мимо end, он все равно остановится, поэтому он будет немного безопаснее. Меня научили использовать это при итерации по целым числам, но я не знаю, действительно ли это считалось "лучшей практикой".

Как я обычно пишу это, предпочитаю <.

Ответ 2

Оба будут работать в большинстве ситуаций.

Если по какой-то причине тело кода, выполняемое в цикле, меняет i на нечто большее, чем 10, первая версия остановит цикл, но вторая будет выполняться вечно.

Ответ 3

Моя повседневная практика заключается в использовании <, когда я повторяю цикл с простыми типами, например целыми числами, и использую !=, когда я работаю с итераторами stl-типа

Ответ 4

for ( initialization ; termination condition ; iteration )

Для каждого из них выберите наиболее подходящий для ваших требований, для termination condition вы можете использовать любой из двоичных условных операторов, таких как >, <, >=, <=, !=

Для данного вопроса рассмотрим случайный случай, в котором

for(i=0;i!=10;i++)
{
 .
 .
 i=11; //somewhere if the loop variable is changed to a value greater than 10 (this assumption is solely for demo)
 .
 .
 .
}

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

Ответ 5

Лучшей практикой является использование!= только с итераторами (С++) и < в противном случае. Никогда не используйте == or!= С float/double. Следующий цикл представляет собой бесконечный цикл:

for (double i = 0.0; i != 1.0; i += 0.1)
    printf("yes, I'm an infinite loop ;)");

Ответ 6

!= позволит тестировать значение true, если значение я превышает 10, тогда как < заставит его оценивать false, если я превысил 10 или просто стал равным ему.

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

Если, однако, вы просто хотите сделать что-то определенное количество раз, < более наглядно, но этого было бы достаточно.!= должен, для простых сквозных циклов с шагами-10-пунктами-и-до-хрюкать, считаться субоптимальными с точки зрения того, чтобы быть явным о вашем намерении.

Ответ 7

Я знаю, что все они останавливаются, когда я достигаю 10, но лучше использовать второй (я слышал).

Это микро-оптимизация. Используйте все, что имеет смысл (и выше < имеет больше смысла).

В чем разница?

В первой версии используется оператор неравенства !=, а второй использует меньший оператор <.

Ответ 8

Я обычно использую < для for-loops по причинам, указанным другими. Тем не менее, в while-loops и более продвинутых for-loops, != упрощает рассуждения о том, что делает моя программа.

Скажем, я хочу найти позицию после первого запуска '5 в массиве типа [5,5,5,3,5,2,3,2,0]. То есть мы хотим k, чтобы 0 <= i < k => a[i] = 5:

int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
    pos = pos+1;

Как только цикл был выполнен, мы знаем, что инвертор защиты цикла имеет значение true: pos == N || a[pos] != 5. В любом случае мы хотим pos.

Теперь скажем, что мы использовали < в защите цикла, тогда все, что мы знали бы после этого, было pos >= N || a[pos] != 5, но это не та ситуация, в которой мы хотели быть. Выполняя намного больше работы, мы можем доказать, что мы не может быть в pos > N, но швы подобны пустой трате времени по сравнению с использованием != в защитной петле.