這對我和其他人都是一個學習問題。我的問題是有一個指向矢量內容的指針。當我擦除矢量的第一個元素時,會發生該問題。我不太清楚我期待的是什麼,我以某種方式假定,當刪除項目時,向量不會開始移動內存中的對象。防止矢量物品被移動
我的問題是:有沒有辦法將對象保留在內存中?例如更改矢量的底層容器?以我的特殊例子來說,我將刪除指針訪問權限,並僅僅使用和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(),它會保留一個空間,所以當您添加一個新的空間時,它會將該元素置於該預留空間,因此不會發生重新分配。只有當它需要增加尺寸時,矢量纔會重新分配 –