Является ли хорошей практикой возвращать ссылки на итераторы? (Это вообще имеет смысл)? - PullRequest
2 голосов
/ 15 сентября 2011

Я не уверен, допустимо ли здесь делать это - возврат итератора по ссылке:

  1. vector :: iterator & getElement (const char * name) {...}

обратите внимание, что мой вектор содержит сами элементы и , а не указатели .

В текущем состоянии я оставил его по значению (без &).

Есть ли консенсус относительно итераторов или я могу использовать оба пути?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Какой в ​​этом смысл? итератор сам по себе является своего рода ссылкой на что-то внутри вектора. Вы хотите дать кому-то итератор, который вы можете изменить внутри? То есть класс, раздающий ссылку на итератор, сам увеличивает его - указывает на другую вещь в векторе - и у клиента каким-то образом есть свой итератор, указывающий на правильную вещь, потому что раньше он вызывал getElement ()? Это единственное применение ссылок на итераторы, о котором я могу думать, и оно определенно пахнет слишком плохо для меня.

Но что еще более важно, существуют серьезные проблемы с выставлением и, следовательно, сохранением итераторов. Итераторы становятся недействительными. Если у вас есть итератор для чего-то внутреннего в вашем интерфейсе, а что-то удаляет или добавляет к вектору, вы не сможете гарантировать, что клиентские итераторы все еще действительны. Затем клиент получает доступ к своему недействительному итератору и происходит неопределенное поведение - например, CRASH.

1 голос
/ 15 сентября 2011

Возврат параметра по ссылке имеет смысл только в том случае, если итератор «принадлежит» другому объекту, и вы хотите, чтобы вызывающая сторона изменила итератор владельца. Что 99% времени это плохая идея. Как правило, итератор должен обрабатываться как указатель, а указатель почти всегда возвращается / передается по значению, за исключением случаев странного совпадения.

...