#c #pointers #stdvector
#c #указатели #стдвектор
Вопрос:
Насколько я знаю, использование указателя или ссылки на std::vector
элемент считается плохой практикой. Но о чем же std::vector::data()
? Остается ли указатель, полученный с помощью data()
, действительным после перераспределения?
Комментарии:
1. Нет, он не остается действительным после перераспределения.
2. Нет. Все указатели и итераторы становятся недействительными при перераспределении.
Ответ №1:
Насколько я знаю, использование указателя или ссылки на элемент std::vector считается плохой практикой.
Ссылки и указатели могут избежать накладных расходов на копирование, что является неплохой практикой, если вы можете гарантировать, что std::vector
они не будут перераспределены в течение срока службы ссылки или указателя.
(Кстати, в C нет необходимости использовать указатели, когда вы можете использовать ссылки)
Но как насчет std::vector::data()? Остается ли указатель, полученный data(), действительным после перераспределения?
Нет. Перераспределение может привести к изменению указателя. Использование старого указателя после перераспределения — это неопределенное поведение. То же самое для итераторов.
Комментарии:
1. Полностью согласен. Это не получение указателей или ссылок, что следует избегать, а хранение (особенно в нелокальных переменных, таких как члены объектов) указателей или ссылок на векторные элементы.