gpt4 book ai didi

c++ - 使用 C++ 智能指针构建多对多/双向引用

转载 作者:行者123 更新时间:2023-11-30 03:54:08 25 4
gpt4 key购买 nike

我决定用 C++ 做一个项目,因为我还不知道 C++。我正在尝试尽可能多地用 C++ 做所有事情,这意味着只有很少的原始指针。

我在构建我的对象集合时遇到了麻烦。公平警告,此描述将非常抽象。

  • 一个类只有一个实例。我们称它为 Foo
  • 这个Foo 需要包含许多Bar 类的对象。需要快速插入和删除,不需要顺序,所以我想用一个集合。
  • 每个 Bar 恰好拥有 4 个 Baz 类型的对象,这些对象是在初始化时创建和固定的。
  • 每个 Baz 都有指向许多其他 Baz 类型对象的指针。出于实现原因,每个 Baz 还必须引用拥有它的 Bar
  • 给定一个现有的 Baz 对象,我需要从 Foo 的集合中删除相应的 Bar 对象并相应地释放内存。 (我有一个算法保证,在删除时,拥有 BarBaz 对象仅指向该 Bar 拥有的其他 Baz 对象)

我尝试实现它的方法是为 Foo 存储一组唯一的 Bar 指针,处理多对多 Baz 关系的共享指针,以及 Baz->Bar 关系的普通引用,每个 Bar 对象 4 个。问题是我无法再从 Baz 对象中获取 Bar unique_ptr。我有一个引用,但设置删除方法需要一个 unique_ptr,因此不容易删除。有没有更好的方法来构造它而不必诉诸手动指针/内存管理?

最佳答案

老实说,我认为这里不需要智能指针,因为所有对象都已由容器管理 - 因此可以确保删除它们。

所以我只使用原始指针并让容器完成它们的工作:

struct Baz
{
struct Bar& bar;
std::vector<Baz*> bazs; // no need to be smart - deleted elsewhere
Baz(Bar& bar): bar(bar) {} // don't use bar in this constructor!
};

struct Bar
{
std::array<Baz, 4> bazs;
Bar(): bazs({*this, *this, *this, *this}) {}
};

struct Foo
{
std::vector<Bar> bars;
};

只要原始指针指向的对象由智能指针或容器管理,使用原始指针就没有问题。

我在此示例中使用了 std::vector,但您可以使用您认为合适的任何内容。我怀疑 std::vectors 可能会与 std::set 竞争,因为它们使用连续内存,这在 CPU 缓存方面表现良好。

关于c++ - 使用 C++ 智能指针构建多对多/双向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29737242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com