Определенно используйте list::end
, если вы проверяете, прошли ли вы до конца списка. Нет никакой гарантии, что следующий элемент после прохождения каждого элемента в списке будет NULL. Он не скажет вам, является ли элемент, на который указывает указатель, действительным. Вот как я бы использовал list::end
, если бы проверял, верны ли мои результаты:
list<whatever>::iterator item = find( myList.begin(), myList.end(), value );
if( item != myList.end() )...
Поскольку find
возвращает последний элемент в диапазоне, который вы дали ему для поиска, если элемент не существует.
Тем не менее, когда вы делаете &(*something)
, вы получаете адрес элемента, на который указывает итератор, и который является абсолютно корректным кодом. Если вы ожидаете, что недействительные элементы будут иметь значение NULL, тогда это работает для ваших целей. Если вы не знаете, будут ли они НЕДЕЙСТВИТЕЛЬНЫМИ, это другая история.
Так какой код вы используете? Возможно, это поможет нам лучше ответить на ваш вопрос.
Edit:
Смотреть на ваш код и видеть, что вы используете list::begin()
, а затем проверять его по NULL - это плохо, если ваш список не является списком указателей (или объектов, подобных указателю, таких как shared_ptr
.). Я бы порекомендовал вам использовать list::empty
чтобы увидеть, пустой ли список, а не myList.begin() != myList.end()
. Смысл этого кристально ясен и его будет легче поддерживать в будущем.