Если вы хотите достичь чего-то подобного, вы не сможете использовать vector<foo>
, чтобы фактически управлять самими foo
объектами.Мне кажется, ваш субвектор foo*
должен указывать на память, за которую отвечает vector<foo>
.(Таким образом, именно поэтому вы все еще видите дополнительный указатель в конце, который указывает на d
, и у вас все еще есть длина 4).
Мне кажется, что вы действительно хотите сделать, это использовать дваvector<foo*>
и вручную создайте объекты, которые хранятся в первом, вместо того, чтобы сам вектор отвечал за объекты.Затем пусть ваш второй vector<foo*>
просто скопирует указатели на объекты, которые вы создали.Таким образом, когда вы удаляете элемент из первого vector<foo*>
, он удалит только его копию указателя, и ваш второй vector<foo*>
не будет затронут.
Подумайте об этом без включенного вектора:
// create the initial storage for all the foo
foo* fooarray = new foo[foo_count];
// create all the foos for the array
for (int i=0; i < foo_count; ++i)
fooarray = new foo();
// get a pointer to a subset of foo
foo* foo_subset_pointer = &fooarray[10];
// make a list of a subset of the fooarray pointers
foo* foo_subset_list = new foo[10];
for (int i=0; i < 10; ++i)
foo_subset_list = fooarray[i];
Итак, теперь, когда вы удаляете элемент из fooarray: у
// remove fooarray[3]
delete fooarray[3];
for (int i=4; i < 20; ++i)
fooarray[i-1] = fooarray[i];
foo_subset_pointer
будет удален исходный элемент 3, так как он был просто указателем на существующий массив.(И если вы получите доступ к foo_subset_pointer[19]
, он все равно будет иметь указатель на то же самое, что и foo_subset_pointer[18]
, потому что элементы не были обнулены ...)
Но что еще хуже, foo_subset_list[3]
все еще указываетисходное местоположение: но это неверно, потому что он был удален!Вот почему вы не хотите, чтобы вектор отвечал за элементы списка, когда вы имеете дело с подмножеством, которое вы хотите сохранить.
Вместо этого звучит так, будто вы хотите, чтобы ваш первый вектор выполнял только удаление элемента (цикл for
выше), но не delete
.В этом случае он оставляет ваш foo_subset_list[3]
нетронутым и все еще указывает на действительный foo
.Дополнительная трудность заключается в том, что теперь вы должны обязательно выполнить delete foo_subset_list[3];
в какой-то момент в будущем.Но это позволяет вам вести себя так, как вы хотели.