繁体   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