std :: vector может динамически изменять размер.То, как это происходит, состоит в том, чтобы удерживать больше места, чем требуется.Как только вы достигнете зарезервированной емкости, необходимо зарезервировать больший блок данных (зависит от реализации, но часто емкость нового блока в два раза превышает предыдущий размер).Затем данные копируются в новое местоположение, поэтому адрес первого элемента изменяется.
При условии, что вы не добавляете больше данных в свой вектор, вам не нужно беспокоиться о указателе наданные в векторе являются недействительными.Вы можете ожидать, когда дальнейший push_back () вызовет изменение размера, проверив, vint.capacity () == vint.size ().Вы также можете избежать использования недействительного указателя, всегда используя обновленный указатель через & vint [0] (или & vint.at () для проверки диапазона), а не копируя его.
Если вы знаетечто вы собираетесь вставить ряд новых элементов, вы можете убедиться, что у вас будет достаточно емкости, используя функцию Reserve () для предварительного выделения пространства (если текущая емкость меньше запрашиваемой).Но имейте в виду, что вы не хотите делать это по частям - например,
vint.reserve(vint.size() + 2000);
for(int i=0; i<2000; ++i) {
vint.push_back(i);
}
было бы хорошо, но
for(int i=0; i<2000; ++i) {
vint.reserve(vint.size() + 1);
vint.push_back(i);
}
было бы перетаскиванием производительности, так как вы постоянно спрашиваетеОС для увеличения объема памяти и выполнения операции копирования с каждой итерацией.