Насколько мне известно, использование указателя или ссылки на элемент std::vector считается плохой практикой. А как же std::vector::data()? Указатель, полученный data(), остается действительным после перераспределения?
Неа. Все указатели и итераторы становятся недействительными при перераспределении.





Насколько мне известно, использование указателя или ссылки на элемент std::vector считается плохой практикой.
Ссылки и указатели могут избежать накладных расходов на копирование, что является неплохой практикой, если вы можете гарантировать, что std::vector не будет перераспределен во время жизни ссылки или указателя.
(Кстати, в С++ нет необходимости использовать указатели, когда вы можете использовать ссылки)
А как насчет std::vector::data()? Указатель, полученный data(), остается действительным после перераспределения?
Нет. Перераспределение может привести к изменению указателя. Использование старого указателя после перераспределения — поведение undefined. То же самое для итераторов.
Полностью согласен. Не рекомендуется использовать указатели или ссылки, а хранить (особенно в нелокальных переменных, таких как члены объектов) указатели или ссылки на векторные элементы.
Нет, он не остается действительным после перераспределения.