C++ std::数组到shared_ptr的向量

C++ std::array to vector of shared_ptr

本文关键字:ptr 向量 std 数组 C++ shared      更新时间:2023-10-16

转换它最惯用的方法是什么?

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其成员之一,整个元素数组就会继续存在。