具有 weak_ptr 的向量,想要返回 shared_ptr 的向量
Having a vector of weak_ptr, want to return a vector of shared_ptr
我目前正在做一个大项目,我需要使用 weak_ptr
而不是 shared_ptr
。
这是我的问题。
我有一个名为 House 的类,其属性为:vector<boost::shared_ptr<People>> my_people
。我想将此数据成员修改为vector<boost::weak_ptr<People>> my_people
。
我的吸盘是
vector<boost::shared_ptr<People>>& getPeople() const
{
return my_people;
}
通常,只需一个简单的weak_ptr
我就可以返回my_people.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;
}
换句话说,我想返回我的weak_ptr
向量,但作为shared_ptr
向量。可能吗?还是我必须返回一个weak_ptr
向量并在我使用它们的任何地方使用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;
}
但是调用 (*it).lock()
只会创建一个shared_ptr
并将其丢弃,它不会更改矢量元素的类型,并且您不能将矢量作为不同类型的返回。
您需要创建一个正确类型的向量,用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
向量。 不同之处在于,如果weak_ptr
已过期,此版本将引发异常,因为如果传递过期weak_ptr
,则shared_ptr
构造函数会引发异常。如果转换了过期的weak_ptr,则使用 transform
的版本将在向量中放置一个空shared_ptr
。
使用 std::transform
std::vector<std::shared_ptr<People>> temp;
sharedTargetList.resize(my_people.size());
//transform into a shared_ptr vector
std::transform(my_people.begin(),
my_people.end(),
temp.begin(),
[](std::weak_ptr<People> weakPtr){ return weakPtr.lock(); }
);
怎么样:
vector<boost::shared_ptr<People>> getPeople() const
{
vector<boost::shared_ptr<People>> res;
for( vector<boost::weak_ptr<People>::iterator it = my_people.begin();
it != my_people.end(); ++it)
res.push_back(it->lock());
return res;
}
此外,如果需要,可以筛选出空指针。
当然,您不能返回对局部变量的引用,因此您必须返回副本。您可能希望改为执行以下操作:
void getPeople(vector<boost::shared_ptr<People>> &res) const
{
for( vector<boost::weak_ptr<People>::iterator it = my_people.begin();
it != my_people.end(); ++it)
res.push_back(it->lock());
}
以避免复制返回向量。
请注意,vector<weak_ptr<T> >
和 vector<shared_ptr<T> >
是两种完全不同的类型。
但是,您可以编写一个接受前者并返回后者的函数:
template<class Ptrs, class WeakPtrs>
void lockWeakPtrs(const WeakPtrs &weakPtrs, Ptrs &ptrs)
{
BOOST_FOREACH (typename WeakPtrs::const_reference weakPtr, weakPtrs)
{
typename Ptrs::value_type ptr = weakPtr.lock();
if (ptr) // if you want to drop expired weak_ptr's
ptrs.insert(ptrs.end(), ptr);
}
}
像这样打电话: lockWeakPtrs(myWeakVector, mySharedVector);
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 为共享 ptr 向量实现复制 c'tor?
- 对唯一 ptr 无效读取的引用向量
- 接口 PTR 的返回向量C++
- 如何在满足谓词的向量中获得唯一PTR的子集
- 通过成员函数将唯一 ptr 的向量附加到另一个向量
- C++ 提升克隆 PTR 向量
- PTR到结构体和PTR到结构体的向量的模板方法专门化