让我们有一个对象集合(比如字符串是集合的类型)。我希望集合的每个元素都有一个引用计数。因此,在 Add-Usage 上,它应该增加这个给定元素的计数。
coll.AddUsage("SomeElement"); // Type doesn't matter - but should increase count
On, Release-Usage ,它应该减少给定元素的引用计数,如果count达到0
,那么它应该从集合中删除元素。
如果AddUsage
将分配元素(并将引用计数设置为1
),或者完全失败(因为元素不存在),这一点并不重要。重要的是RemoveUsage
,它应该从集合中删除给定的元素(对象)。
我想过使用vector
(或自定义结构)的pair
,或使用任何类型的map
/ multimap
。 C ++库中不存在现有的类(可能不在线程支持库,一个原子类,共享指针类等)。
问题:
那么,我的问题是如何使用现有的C ++库来实现这样的想法?它应该是线程安全的。是的,C ++ 11/14对我来说完全没问题。如果有好主意,我可能会在模板之上制作它。
答案 0 :(得分:2)
假设您要求数据结构来实现引用计数集合......
使用带有K的map<K,V>
作为集合元素的类型(在示例字符串中)和V a类型来跟踪有关元素的元信息(例如引用计数)。最简单的情况是V为int
。
然后,AddUsage
很简单,只需refMap[value]++
。对于RemoveUsage,只需执行refMap[value]--
,然后检查计数器是否为零,并从地图中删除该值。
您也需要添加错误处理,因为AddUsage
/ RemoveUsage
可能是
使用不在地图中的对象调用(未添加到集合中)
编辑:您使用&#34;多线程&#34;标记了您的问题,因此您可能希望使用某种互斥锁来保护对refMap
的并发访问。
答案 1 :(得分:1)
你可以实现类似于shared_ptr
类的东西,但是可以扩展它来保存对象的集合。
就像你可以设计一个以map/multimap
为数据成员的类。键将是您的对象,值是您的引用计数。就接口而言,只需公开两种方法: -
AddUsage(Object);
RemoveUsage(Object);
在AddUsage方法中,首先要检查map中是否已存在元素。如果是,则只增加计数。同样,您将处理RemoveUsage.Object如果其引用计数达到零,将从映射中删除。
这只是我的意见。如果此实施中存在任何瓶颈,请告诉我。
答案 2 :(得分:-3)
您可以在结构或类中使用静态成员(整数)变量。你想要的增量或减量。如果值为零,则删除元素。