[英]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.