В настоящее время у меня есть вектор класса Foo
и другой вектор указателей, которые указывают на подмножество Foo
в векторе. В настоящее время у меня есть функция, которая выбирает некоторые указатели из vector<Foo *>
и удаляет их из vector<Foo>
, который на самом деле их содержит. Таким образом, вначале два вектора выглядят так:
//Foo classes in vector<Foo>
a
b
c
d
а также
//Foo pointers in vector<Foo *>
*a
*b
*c
*d
Однако я обнаружил, что после удаления Foo
, скажем, b
, они выглядят так:
//Foo classes in vector<Foo>
a
c
d
а также
//Foo pointers in vector<Foo *>
*a
*c
*d
*d
Почему указатель на c
в vector<Foo *>
не остается на c
после удаления b
в vector<Foo>
? Есть ли способ исправить это?
(Я понимаю, что если я удалю b
, исходный указатель на b
будет висячим; однако, поскольку я все равно не собирался обращаться к b
после его удаления, я подумал, что это не имеет значения, и я мог бы перейти к следующему индексу с указателем на c
)
ИЗМЕНИТЬ:
По запросу код, в котором заполняется вектор указателя:
for(int i = 0; i < a.size(); i++) //a is the vector<Foo>
{
Foo * thisFoo = &a[i];
if(someConditionMet)
b.push_back(thisFoo); //b is the vector<Foo *>
}
std::vector
может привести к его перераспределению, что сделает недействительными все указатели на его элементы. 21.08.2011std::list
. Удаление элементов из списка не приводит к перемещению следующих элементов. 21.08.2011