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

时间:2017-04-14 15:22:03

标签: c++ pointers containers shared-ptr smart-pointers

最常用的转换方法是什么?

std::array<SomeType,SIZE> arr;

std::vector<shared_ptr<SomeType>> vec;  // <--- want to fill with pointers
                                        //      to items in arr

第二个问题 - 是否可以在堆栈分配 shared_ptr中为对象创建array?一旦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
}

1 个答案:

答案 0 :(得分:2)

如果您想要一个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,您的整个元素数组将继续存在。