簡體   English   中英

C ++ std :: array到shared_ptr的向量

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM