Почему лучше использовать «! =», Чем «<» в векторном цикле? (C ++) - PullRequest
10 голосов
/ 16 мая 2009

Почему лучше использовать «! =», Чем «<» в векторном цикле? Я просто не вижу разницы. </p>

Ответы [ 7 ]

22 голосов
/ 16 мая 2009

Поскольку вы используете итераторы, и цикл будет выглядеть точно так же, как и другие контейнеры, если вы решите переключиться на другие типы контейнеров, такие как set, list, unordered_set и т. Д., Где <не имеет значения . </p>

8 голосов
/ 16 мая 2009

Я предполагаю, что вы имеете в виду использование !=vector.end() вместо <vector.size(), поскольку это не было ясно из вашего вопроса.

Одна из причин предпочесть версию end () состоит в том, что вы действительно пытаетесь сделать, это проверить, достигли ли вы конца.

Идиома для такого рода проверок массивов в C заключалась в проверке индекса по сравнению с размером, но это "устаревшее" поведение. Затем он распространялся в мире Java (как <<code>array.length) до тех пор, пока люди не осознали, что массивы являются злом и что Java наконец поддерживает дженерики. Однако в C ++ нет смысла использовать эту идиому, когда у вас есть хороший класс коллекции, такой как vector, для работы. Это более читабельно и более легко обслуживаемо. Например, при необходимости легче переключаться на другие коллекции, поскольку вы все еще говорите о конце.

6 голосов
/ 16 мая 2009

Некоторые типы итераторов не поддерживают оператор меньше чем - они поддерживают только оператор неравенства. Вот почему вы часто будете видеть, что оставленный оператор меньше, чем.

3 голосов
/ 16 мая 2009

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

Так как <имеет смысл только для векторов, это плохо подходит для универсальной функции. Если вы используете <, вы привязываетесь к использованию вектора. </p>

2 голосов
/ 16 мая 2009

Может случиться так, что программист запомнил защитный трюк кодирования: в случае, если во время выполнения цикла что-то пойдет не так, и индекс / указатель / итератор пройдет мимо конца, цикл будет тихо остановлен после проверки '<', оставляя ошибка незаметна С! =, Вероятно, будет хаос и сбой, поскольку цикл продолжается с неверными данными, что позволяет выполнить более раннее исправление. </p>

1 голос
/ 16 мая 2009

Для векторных итераторов это не имеет никакого значения. В общем, итераторы могут не поддерживать '<' just '==' и '! ='. Следовательно, самый общий способ проверить, не достигли ли вы конца коллекции, - это проверить, является ли итератор! = Container.end () </p>

0 голосов
/ 16 мая 2009

Другая причина: при переводе в сборку ветвь-равно или ветвь-не равно обычно намного быстрее, чем ветвь сравнения.

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