C++ std::数组到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
其成员之一,整个元素数组就会继续存在。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 为共享 ptr 向量实现复制 c'tor?
- 对唯一 ptr 无效读取的引用向量
- 接口 PTR 的返回向量C++
- 如何在满足谓词的向量中获得唯一PTR的子集
- 通过成员函数将唯一 ptr 的向量附加到另一个向量
- C++ 提升克隆 PTR 向量
- PTR到结构体和PTR到结构体的向量的模板方法专门化