QCache 缓存(模板类,类似于map,逻辑意义上的缓存,方便管理,和CPU缓存无关。自动获得被插入对象的所有权,超过一定数量就会抛弃某些值)

在软件开发中,我们经常需要在内存中存储一些临时数据用于后续相关计算。我们一般把这些数据存储到某个数组里,或者STL中的某个合适的容器中。其实,在Qt中直接为我们提供了一个QCache类专用于这种需求。

QCache类是一个模板类。QCache<key, T> 就定义了一个缓存,其类似于map,也是存储的键值对。例如,下面的代码定义了一个缓存,里面存储的键是一个整数,值是我们自定义的Employee类型:


QCache<int, Employee> cache;
Employee *employee = new Employee;
employee->setId(37);
employee->setName("Richard Schmit");
cache.insert(employee->id(), employee);

根据上面的例子也可以看出,QCache里存储的值只能是一个指针。其中,insert()函数的声明如下:

bool insert(const Key &key, T *object, int cost = 1)

使用QCache和其他类型基于键值对的数据结构,如QMap或者QHash相比,好处是QCache自动获得被插入对象的所有权,并在需要的时候自动释放他们来为新插入的对象腾出空间。同时,在插入一个对象时,也可以为它指定一个cost,它表示某种关系,关于当前被插入的对象所占用的内存数量。当所有对象的costs总和,即totalCost()的返回值,达到了缓存对象的限制,即maxCost(),QCache就会开始从缓存中删除对象,以保持totalCost 不超过所设置的上限。当然,其所使用的删除算法是从最近最少访问的对象开始。默认情况下,QCache的maxCost() 是100。我们可以根据自己的需要在定义QCache对象时,指定一个具体值。如下代码所示:

QCache<int, MyDataStructure> cache(5000);

并且,根据上面说到的insert() 函数,我们可以在插入一个对象的同时,为其指定一个具体的cost。当调用insert() 之后,这个对象就被QCache对象所拥有了,当然,它随时都可能被释放从而为其他对象腾出缓存空间。并且,若传入的cost超过了maxCost() 函数的返回值,那么该对象会被立即释放。
同样,类似于其他的键值对容器,你可以使用key和[]运算符来访问缓存中的某个对象,如果存在你所传入的key,则返回一个指向对象的指针,否则,返回0。除了这种方式,QCache还为我们提供了object() 成员函数来完成同样的功能。其声明如下:


T *QCache::object(const Key &key) const

当想从缓存中移除某个特定key所对应的对象,可以调用remove()。但是,这个操作会导致QCache对象释放该对象。如果你只是想从缓存对象中删除某个对象,而不释放它,可以使用take()函数,其实,该函数就是让你从缓存对象中重新获得某个对象的所有权。
至于,其他的操作,和普通容器类似。比如,

使用clear() 函数来释放缓存中所以得对象。

使用contains() 函数判断当前缓存中释放包含某个key。

使用count() 或 size() 获得当前缓存中保存的对象的个数。

使用isEmpty() 函数判断当前缓存是否包含对象。

......

还有更多的成员函数供我们使用,其大家用到时具体再参考Qt的帮助文档。
---------------------
作者:求道玉
来源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/63685295
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/findumars/p/10247199.html