这对我和其他人都是一个学习问题。我的问题是有一个指向矢量内容的指针。当我擦除矢量的第一个元素时,会发生该问题。我不太清楚我期待的是什么,我以某种方式假定,当删除项目时,向量不会开始移动内存中的对象。防止矢量物品被移动
我的问题是:有没有办法将对象保留在内存中?例如更改矢量的底层容器?以我的特殊例子来说,我将删除指针访问权限,并仅仅使用和id作为对象,因为类无论如何都需要一个ID。
这里是一个简单的例子:
#include <iostream>
#include <vector>
class A
{
public:
A(unsigned int id) : id(id) {};
unsigned int id;
};
int main()
{
std::vector<A> aList;
aList.push_back(A(1));
aList.push_back(A(2));
A * ptr1 = &aList[0];
A * ptr2 = &aList[1];
aList.erase(aList.begin());
std::cout << "Pointer 1 points to \t" << ptr1 << " with content " << ptr1->id << std::endl;
std::cout << "Pointer 2 points to \t" << ptr2 << " with content " << ptr2->id << std::endl;
std::cout << "Element 1 is stored at \t" << &aList[0] << " with content " << aList[0].id << std::endl;
}
我得到的是:
Pointer 1 points to 0xf69320 with content 2
Pointer 2 points to 0xf69324 with content 2
Element 1 is stored at 0xf69320 with content 2
从矢量(以及许多其他操作)中删除项目可能会在内存中移动内容。如果您想避免这种情况,请使用基于节点的容器,如std :: list或std :: deque。 –
a矢量元素根据定义存储在连续的存储器中。如果你想要一个容器来保存一个元素,但记得从容器中移除它,那么这不是一个矢量 – user463035818
如果你真的想要一个这样的矢量,然后使用std :: vector :: reserve(),它会保留一个空间,所以当您添加一个新的空间时,它会将该元素置于该预留空间,因此不会发生重新分配。只有当它需要增加尺寸时,矢量才会重新分配 –