gpt4 book ai didi

c++ - 有一个 weak_ptr 的 vector ,想要返回一个 shared_ptr 的 vector

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:29 25 4
gpt4 key购买 nike

我目前正在做一个大项目,我需要使用 weak_ptr而不是 shared_ptr .

这是我的问题。

我有一个名为 House 的类,其属性为:vector<boost::shared_ptr<People>> my_people .我想修改这个数据成员为vector<boost::weak_ptr<People>> my_people .

我的 setter/getter 是

vector<boost::shared_ptr<People>>& getPeople() const
{
return my_people;
}

通常,使用简单的 weak_ptr我可以回my_people.lock();

但是我有一个 vector ,但我不知道如何做这样的事情:

vector<boost::shared_ptr<People>>& getPeople() const
{
for( vector<boost::weak_ptr<People>::iterator it = my_people.begin();
it != my_people.end();
++it)
{
(*it).lock();
}

return my_people;
}

换句话说,我想返回 weak_ptr 的 vector 但作为 shared_ptr 的 vector .可能吗?或者我必须返回 weak_ptr 的 vector 吗?并使用 lock()我到处使用它们?

最佳答案

你的函数是一个合理的开始:

vector<boost::shared_ptr<People>>& getPeople() const
{
for( vector<boost::weak_ptr<People>::iterator it = my_people.begin();
it != my_people.end();
++it)
{
(*it).lock();
}

return my_people;
}

但是调用 (*i​​t).lock() 只是创建一个 shared_ptr 并把它扔掉,它不会改变 vector 元素的类型,而且你无法将 vector 作为不同类型返回。

您需要创建一个正确类型的 vector ,用 shared_ptr 对象填充它,然后返回它:

vector<boost::shared_ptr<People>> getPeople() const
{
vector<boost::shared_ptr<People>> people(my_people.size());
std::transform(my_people.begin(), my_people.end(), people.begin(),
boost::bind(&boost::weak_ptr<People>::lock, _1));
return people;
}

这遍历 my_people 的每个元素,对其调用 lock(),并将结果分配给 people 的相应元素。

如果您知道 my_people 从不包含过期指针,那就更简单了:

vector<boost::shared_ptr<People>> getPeople() const
{
vector<boost::shared_ptr<People>> people(my_people.begin(), my_people.end());
return people;
}

这通过从 weak_ptr 元素构造每个 shared_ptr 元素来填充 people vector 。不同之处在于,如果 weak_ptr 已过期,此版本将抛出异常,因为如果传递过期的 weak_ptrshared_ptr 构造函数将抛出异常。如果转换过期的 weak_ptr,使用 transform 的版本将在 vector 中放置一个空的 shared_ptr

关于c++ - 有一个 weak_ptr 的 vector ,想要返回一个 shared_ptr 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895816/

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