gpt4 book ai didi

c++ - 访问 std vector 中的 unique_ptr - 必须提供复制构造函数吗?

转载 作者:行者123 更新时间:2023-11-30 02:15:10 25 4
gpt4 key购买 nike

我创建了一个 std vector 并使用 std 移动将一堆对象推回到它上面,例如:

vector<unique_ptr<Foo> > myVec;
unique_ptr<Foo> a = make_unique<Foo>();
unique_ptr<Foo> b = make_unique<Foo>();
myVec.push_back(move(a));
myVec.push_back(move(b));

到目前为止,还不错。

稍后,我将 myVec 的引用传递给一个函数,并尝试使用 [] 运算符访问 vector 中的数据。

void someFunc(vector<unique_ptr<Foo> > &myVec)
{
Foo* anObj = myVec[0];
}

阅读一些内容后,我猜测这种方法行不通,因为 std vector 会尝试制作一个拷贝,除非我在 Foo 上提供一个避免实际制作拷贝的复制构造函数,否则它永远不会奏效。我对么?我想我看到了一些关于使用迭代器的帖子,但如果没有必要,我宁愿不看。

编辑1:

我确实通过以下方法解决了这个问题(使用迭代器然后获取原始指针)

void someFunc(vector<unique_ptr<Foo> > &myVec)
{
int offset = 0; // Or some other offset into the vector
auto it = myVec.begin() + offset;
Foo* anObj = it.get();
// ... Do something using anObj here...
}

我认为这是可行的方法,只要您不愚蠢地尝试保留 anObj 然后在某处手动释放它即可。我当然可以暂时转让所有权,直到我完成它,然后再归还所有权,但这感觉很麻烦。对上述方法有什么想法吗?

提前致谢,/吉米

最佳答案

anObj变量应为 std::unique_ptr<Foo> 类型而不是 Foo* .

代码应该是:

std::unique_ptr<Foo>& anObj{ myVec[ 0 ] };

或者

Foo* anObj{ myVec[ 0 ].get( ) };

关于c++ - 访问 std vector 中的 unique_ptr - 必须提供复制构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56530715/

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