[英]C++ std::array to vector of shared_ptr
转换的最惯用的方法是什么?
std::array<SomeType,SIZE> arr;
std::vector<shared_ptr<SomeType>> vec; // <--- want to fill with pointers
// to items in arr
第二个问题-是否可以为堆栈分配的 array
对象创建一个shared_ptr
? 一旦vec
被销毁,指针目标会被“释放”吗?
编辑
我需要这样的东西
class Element {
Element *next;
}
class Group {
std::vector<Element*> elems;
}
int main() {
...
std::array<Element,10> elems = {...};
std::array<Group,4> groups = {...};
// shuffle elems and assign to groups; set next-pointers in elems:
// group1: &elem10
// group2: &elem8 &elem5
// group3: &elem2 &elem7 &elem3
// group4: &elem4 &elem9 &elem1 &elem6
// at some point:
// save or load all elems and groups,
// preserving pointers elem->elem, group->elem
}
如果要对对象使用shared_ptr
,则应确保该对象确实由shared_ptr
管理。 玩游戏很危险,并且可能导致不确定的行为。 在您的情况下,技巧是使用shared_ptr
管理数组本身。 这将使您可以检索到其任何元素的有效shared_ptr
。
auto elems = std::make_shared<std::array<Element,10>>();
然后,您可以使用shared_ptr
的别名构造函数为各个元素创建shared_ptrs
。 如果要将这些shared_ptrs
粘贴在vector
,则可以执行以下操作:
std::vector<std::shared_ptr<Element>> v;
v.reserve(elems->size());
std::transform(
elems->begin(),
elems->end(),
std::back_inserter(v),
[&elems] (Element& e) { return std::shared_ptr<Element>{ elems, &e }; });
请注意,这样做的结果(可能是意外的)是,只要您对其中一个成员具有shared_ptr
,整个元素数组将继续存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.