存储unique_ptrs、shared_ptrs或 ID 的列表
Store list of unique_ptrs, shared_ptrs, or IDs?
假设我有这样的类:
class Foo
{
public:
Foo();
private:
int id;
//Other data...
std::list< ??? > connected_foo;
}
class Bar
{
public:
Bar();
private:
std::list<std::unique_ptr<Foo> > all_foo;
}
在类 Foo
中,我创建了一个类似图的结构,以便一些Foo
对象链接到其他Foo
对象。
在C++11中,哪个最"正确"?具体来说,???
应该是什么?unique_ptr
列表 ?shared_ptr
列表 ?还是int
列表,带有循环访问all_foo
并找到特定对象的函数?
还是我应该一起使用不同的数据结构(即map
)?我知道 Boost 库提供图表,但这比我在这里寻找的要多一点(又名想坚持使用C++标准库)。
如果"正确"太模糊(可能是),请按顺序假设优先级是可读性、最不可能导致内存泄漏和简洁性。
几点说明:我对C++相当陌生(来自 C),所以我尽量不使用C++作为"C with OO"。在 C 语言中,我会使用一个指针数组,并很可能将其称为一天(特别是因为我知道在程序结束之前不会释放对象);无法创建unique_ptr
的副本让我有点困惑。我在这里瞄准的具体应用是在逻辑门外创建一个电路(使用 OO)。这是一个(研究生)学校项目。
在不知道您的完整用例的情况下,可能不可能给出答案。但是,如果Bar
真的拥有所有Foo
并且会比所有都长寿(正如您在问题中所述),我会建议:
std::vector<Foo*> connected_foo;
原始指针没有错 - 我们不使用它们来传达任何所有权语义,只是观察。
拥有unique_ptr<Foo>
容器是错误的 - Bar
已经拥有独特的所有权。您可以使它们shared_ptr<Foo>
(并将Bar
更改为共享所有权)。这是正确的,但如果Bar
真的拥有它们,那就没有必要了。相反,存储ID意味着进行查找的成本更高,因此我不确定这有什么好处。
如果您不打算在每次删除对象时遍历all_foo并清除所有对象中的引用,则可以使用 std::list<std:weak_ptr<Foo>> connected_foo;
并根据需要检查和更新connected_foo。然后,当您想在节点中使用连接的foo时,首先将其锁定以共享并检查它是否存在,如果不存在,则将其从已连接列表中删除。请注意,您必须为此保持std::list<std::shared_ptr<Foo>>
all_foo。
- 从函数角度看ID到文件路径的内部与外部映射
- 通过组合不同的类型来创建唯一的id
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- FFMPEG配置文件级别id大小无效
- 方法内部但循环仍得到预期的不合格id错误C++
- 如何获取 GLFW 窗口 ID?
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 显示数组中的学生 ID 和最高分
- C++:"("令牌"之前有预期的非限定 id 指向类中成员函数的指针
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- Xcode 9.4.1 中的 Apple Mach-O 链接器 (id) 错误
- 错误:令牌 { '{' 之前应存在非限定 ID
- 断言"id < 0"在Qt ActiveX中失败
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 如何根据两个因素组织向量:id 和数量?(C++)
- 在返回 0 之前应为非限定 ID
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 编译时检查特征专用化是否具有唯一 ID
- DCMTK 了解"DIMSE 没有有效的演示上下文 ID"错误
- 一种有效的数据结构,用于按 ID 访问和查找加权随机项