C++ std::带有共享指针的无序_映射,用于自动销毁条目
我有一个C++ std::带有共享指针的无序_映射,用于自动销毁条目,c++,shared-ptr,unordered-map,C++,Shared Ptr,Unordered Map,我有一个unordered_映射,并且有各种共享指针指向unordered_映射中的每个条目。这样一来,一旦所有共享指针都被销毁,条目就会从无序映射中删除custom_object当前包含该键,以便在销毁时可以从unordered_map中删除相应的条目。我希望有一个更优雅的设计,也许可以实现一个无序的映射。对此有何想法?您可以为共享\u ptr使用自定义删除器,删除对象并将其从地图中删除: class custom_object_deleter { public: custom_obj
unordered_映射
,并且有各种共享指针指向unordered_映射
中的每个条目。这样一来,一旦所有共享指针都被销毁,条目就会从无序映射中删除custom_object
当前包含该键,以便在销毁时可以从unordered_map
中删除相应的条目。我希望有一个更优雅的设计,也许可以实现一个无序的
映射。对此有何想法?您可以为共享\u ptr
使用自定义删除器,删除对象并将其从地图中删除:
class custom_object_deleter
{
public:
custom_object_deleter(unordered_map<int, custom_object*>* map) :
map(map)
{
}
void operator()(custom_object* object)
{
// Remove object from map.
delete object;
}
private:
unordered_map<int, custom_object*>* map
};
很抱歉,我只是快速地完成了这个,还没有测试编译错误
但是,这仍然不是一个非常优雅的解决方案。您可能需要后退一步,检查需要此功能的设计是否真的是最好的(也是最简单的!)。您可以使用Boost Intrusive的自动取消链接功能。您必须切换到基于树的(有序)映射,否则它可能会满足您的需要。更具体的细节会有所帮助,也许一些示例代码会准确地显示您的类型。这是朝着正确方向迈出的一步。但是,您必须找出另一个触发器,以从无序映射中删除自定义对象*
s。用于从无序映射中删除它们的触发器将消失。请在无序映射中使用弱ptr。当一个条目的最后一个共享\u ptr消失时,弱\u ptr将告诉您该对象消失了。不利的一面是地图上的物品。
shared_ptr<custom_object> my_custom_object(new custom_object, custom_object_deleter(&map));