gpt4 book ai didi

c++ - 防止 vector 项被移动

转载 作者:太空狗 更新时间:2023-10-29 23:13:02 25 4
gpt4 key购买 nike

这对我来说是一个学习问题,希望其他人也是如此。我的问题分解为有一个指向 vector 内容的指针。当我删除 vector 的第一个元素时会出现问题。我不太确定我在期待什么,我以某种方式假设,在删除项目时, vector 不会开始移动内存中的对象。

我的问题是:有没有办法将对象保存在内存中?例如改变 vector 的底层容器?在我的特定示例中,我将删除指针访问并仅使用对象的 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::vector<std::unique_ptr<T>>而不是 std::vector<T> .当 vector 调整大小时,每个对象的实际实例都不会移动。这意味着更改对 &aList[i] 的任何使用至 aList[i].get()aList[i].idaList[i]->id .

#include <iostream>
#include <memory>
#include <vector>

class A
{
public:
A(unsigned int id) : id(id) {};
unsigned int id;
};

int main()
{
std::vector<std::unique_ptr<A>> aList;

aList.push_back(std::make_unique<A>(1));
aList.push_back(std::make_unique<A>(2));

A * ptr1 = aList[0].get();
A * ptr2 = aList[1].get();

aList.erase(aList.begin());

// This output is undefined behavior, ptr1 points to a deleted object
//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].get() << " with content " << aList[0]->id << std::endl;

}

请注意 ptr1将指向一个已删除的对象,因此它仍然是未定义的行为来尊重它。

另一种解决方案可能是使用不会使引用和指针失效的不同容器。 std::list除非特别删除,否则永远不会使节点无效。但是,不支持随机访问,因此无法直接修改您的示例以使用 std::list .您必须遍历列表才能获得指针。

关于c++ - 防止 vector 项被移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com