vector<const A*> apoint(5);
Создает vector
и предварительно загружает его с 5 const A*
с, которые будут инициализированы по умолчанию. Это означает, что apoint
, прежде чем push_back
, что-либо содержит 5 нулевых указателей. Поскольку размер уже равен 5, apoint.reserve(5);
фактически ничего не делает. Это также относится к vector<A> a(5);
.
Это значит
for(unsigned int i = 0; i<5; i++){
cout<< i <<"\t"<< a[i].x <<"\t" << &a[i]<<"\t" << apoint[i] <<endl;
}
распечатывает эти 5 нулевых указателей, прежде чем он достигнет пяти, добавленных с помощью push_back
. Изменить
vector<const A*> apoint(5);
до
vector<const A*> apoint;
для создания пустого vector
или присвоения этих 5 указателей с помощью apoint[index] = &thisA;
и удаления The
apoint.reserve (5); `.
Но ...
for(const A thisA : a){
apoint.push_back(&thisA);
}
Нужно разбить немного больше, чтобы обнаружить вторую ошибку. const A thisA : a
создает копии элементов в a
, которые существуют только для одной итерации цикла for
. Эти указатели слишком недолговечны, чтобы быть вам полезными. Требуются ссылки на значения в a
, а не на копии, поэтому
for(const A thisA : a){
apoint.push_back(&thisA);
}
должно быть
for(const A & thisA : a){
apoint.push_back(&thisA);
}
Примечание о хранении ссылок на элементы в vector
s: Обычно это плохая идея. Если задать новый вопрос и объяснить свою цель, мы сможем предложить лучшие альтернативы. Если вам действительно нужны указатели на vector
элементов, будьте очень осторожны, чтобы не нарушить правил аннулирования итераторов .