gpt4 book ai didi

c++ - 如何 "invalidate"一个像STL迭代器的对象

转载 作者:行者123 更新时间:2023-11-30 02:54:04 24 4
gpt4 key购买 nike

模糊的标题,但很难用 100 个字符来解释我需要什么。我有一张 map 的 map ,每个 map 都包含不同类型的派生对象。看起来像这样:

/* will use smart pointers in the final product, just using plain 
pointers to simplify the example.*/

// The long is a type id and the string is a unique identifier
std::map<long, std::map<std::string, Node *> > m_NodeList;

这些节点中的每一个都包含一个或多个组件,具体取决于它们的特定类型。这些组件位于 map 中的不同 map 中。看起来像这样。

std::map<long, std::map<std::string, Component *> > m_ComponentList;

这种交互的一个例子是这样的:

class Mesh :
public Component
{
// some graphics api stuff
};

class Vector3 :
public Component
{
public:
float x, y ,z;
};

class Graphics :
public Node
{
public:
Node(Vector3 & vec, Mesh & model) :
m_Pos(vec),
m_Model(model)
{}

Vector3 & m_Pos;
Mesh & m_Model;
};

我已经解决了很多类型魔术,因为我以前做过类似的事情,但现在我遇到了依赖性问题。我希望组件和节点能够在任何给定时间从系统中删除。但是,节点始终依赖于组件的存在。逻辑是这样的,如果一个节点被删除,没有变化,如果一个组件被删除,我还需要删除所有依赖它的节点。假设这两个映射都存在于对象调用 Mediator 中。你们如何保留依赖关系列表,以便中介知道也销毁某些节点?另外,如果你想以不同的方式组织这个方案,我也想听听。提前致谢!

编辑:如果你能想到一个更相关的标题,谢谢 -_-

最佳答案

组件将需要指向所有依赖节点并在销毁自身时移除它们。当依赖节点被创建或销毁时需要通知组件,以便组件更新所有依赖节点的列表。

使用 Boost.Intrusive list对依赖节点列表使用自动取消链接可能是有益的,因为当一个节点被销毁时,它会自动从列表中删除。

将节点存储在 Boost.Intrusive set with auto unlink 而不是 std::map 中也可能有帮助。

请注意,要从侵入式容器中删除节点,您不需要指向容器本身的指针。您只需删除该节点,它就会自动删除。

关于c++ - 如何 "invalidate"一个像STL迭代器的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372709/

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