Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::带有共享指针的无序_映射,用于自动销毁条目_C++_Shared Ptr_Unordered Map - Fatal编程技术网

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));