集合中的引用计数

Reference counting in a collection

本文关键字:引用 集合      更新时间:2023-10-16

让我们有一个对象的集合(假设字符串是集合的类型)。我希望集合的每个元素都有一个引用计数。因此,在添加用法上,它应该增加此给定元素的计数。

coll.AddUsage("SomeElement"); // Type doesn't matter - but should increase count

在发布用法上,它应该减少给定元素的引用计数,如果计数达到 0 ,那么它应该从集合中删除该元素。

AddUsage是否会分配元素(并将引用计数设置为 1),或者会完全失败(因为元素不存在),这并不重要。重要的是RemoveUsage,它应该从集合中删除给定的元素(对象)。

我想使用pair(或自定义结构)的vector,或使用任何类型的map/multimap。C++库中不存在现有的类(可能不在线程支持库、一个原子类、共享指针类等)。

问题:

所以,我的问题是如何使用现有的C++库来实现这样的想法?它应该是线程安全的。是的,C++11/14 对我来说完全没问题。如果有好主意,我可能会在模板之上制作它。

假设您要求一个数据结构来实现您的引用计数集合......

使用带有 K 作为集合元素类型(在示例字符串中)和 V 类型的map<K,V>来跟踪有关元素的元信息(例如引用计数)。最简单的情况是当 V int 时。

然后,AddUsage很简单,只需refMap[value]++即可。对于 删除用法 只需执行refMap[value]--,然后检查计数器是否达到零并从地图中删除该值。

您还需要添加错误处理,因为AddUsage/RemoveUsage可能是使用不在映射中的对象调用(未添加到集合中)

编辑:您用"多线程"标记了您的问题,因此您可能希望拥有某种互斥锁来保护对refMap的并发访问。

你可以实现类似于类shared_ptr但扩展它以保存对象的集合。

就像您可以设计一个以map/multimap作为其数据成员的类一样。键是你的对象,值是你的引用计数。就接口而言,只需公开两种方法:-

AddUsage(Object);
RemoveUsage(Object);

在 AddUsage 方法中,您将首先检查 map 中是否已存在元素。如果是,则仅增加计数。同样,您将处理RemoveUsage.Object,如果其引用计数达到零,则会从映射中删除。

这只是我的意见。如果此实现中存在任何瓶颈,请告诉我。

您可以在结构或类中使用静态成员(整数)变量。 随心所欲地递增或递减。如果值为零,则删除该元素。