集合中的引用计数
Reference counting in a collection
让我们有一个对象的集合(假设字符串是集合的类型)。我希望集合的每个元素都有一个引用计数。因此,在添加用法上,它应该增加此给定元素的计数。
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,如果其引用计数达到零,则会从映射中删除。
这只是我的意见。如果此实现中存在任何瓶颈,请告诉我。
您可以在结构或类中使用静态成员(整数)变量。 随心所欲地递增或递减。如果值为零,则删除该元素。
- 将对象数组的引用传递给函数
- 处理多个异常集合的C++方法
- 什么时候在C++中返回常量引用是个好主意
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- 如何将ampl中的集合表示为c++中的向量
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 检查值是否在集合p1和p2中,但不在p3中
- 集合中的引用计数
- 在C++中,如何最好地解耦两个必须维护彼此引用集合的类
- 更好的std::在指针集合上查找,并将取消引用的值与常量引用值进行比较
- STL集合的去引用迭代器
- 返回对集合中unique_ptr的引用
- 迭代包含向量的集合,而不使用任何基于范围的循环或对向量的引用
- 当对集合的引用未更改时,我是否应该返回集合
- C++引用集合