在软件开发中,我们经常需要在内存中存储一些临时数据用于后续相关计算。我们一般把这些数据存储到某个数组里,或者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
版权声明:本文为博主原创文章,转载请附上博文链接!

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

  1. QCache<key,T> 就定义了一个缓存,其类似于map,好处是QCache自动获得被插入对象的所有权,控制所有对象的costs总和(自动管理对象的生存时间。正经数据是不会用到它的,辅助控制才有可能用到它)

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

  2. QCache 缓存(类似于map的模板类,逻辑意义上的缓存Cache,方便管理,默认类似于LRU的淘汰算法)

    最近在学习缓存方面的知识,了解了缓存(Cache)的基本概念,为什么要使用缓存,以及一些缓存算法(缓存替换),如LRU.LFU.ARC等等. 这些缓存算法的实现过程会使用一些基本的数据结构,如list ...

  3. 使用方法拦截机制在不修改原逻辑基础上为 spring MVC 工程添加 Redis 缓存

    首先,相关文件:链接: https://pan.baidu.com/s/1H-D2M4RfXWnKzNLmsbqiQQ 密码: 5dzk 文件说明: redis-2.4.5-win32-win64.z ...

  4. 移位操作<<和>>,是逻辑数字上的移动(和大端小端无关)

    问题描述 这几天帮同事调试DSP TMS320F28335,这鬼东西蛋疼死了.char是16bit的,16位就是他的最小内存单元.但是PC机串口发过来的有8bit的数据,然后转换就出问题. 一开始不知 ...

  5. thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase

    本节主要介绍缓冲相关的传输类,缓存的作用就是为了提高读写的效率.Thrift在实现缓存传输的时候首先建立一个缓存的基类,然后需要实现缓存功能的类都可以直接从这个基类继承.下面就详细分析这个基类以及一个 ...

  6. 开涛spring3(7.2) - 对JDBC的支持 之 7.2 JDBC模板类

    7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...

  7. STL标准模板类

    STL,中文名标准模板库,是一套C++的标准模板类(是类!),包含一些模板类和函数,提供常用的算法和数据结构. STL分为:迭代器,容器,适配器,算法以及函数对象. --迭代器是一种检查容器内元素并遍 ...

  8. (转)JDBC模板类。

    Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTempl ...

  9. spring3:对JDBC的支持 之 JDBC模板类

    7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...

随机推荐

  1. shell脚本监控调度器/proc进程是否运行(嵌套循环)

    /proc/<pid>/schedstat $/schedstat First: , Second:time spent waiting on a runqueue,这个值与上面的se.w ...

  2. mongoDB 获取最后插入的文档的ObjectID/_id方法

    http://stackoverflow.com/questions/3338999/get-id-of-last-inserted-document-in-a-mongodb-w-java-driv ...

  3. centos7单机版安装hbase

    1.首先安装jdk1.8 yum install java-1.8.0-openjdk* -y 2.下载hbase 地址:http://mirrors.shuosc.org/apache/hbase/ ...

  4. hdu1584 A strange lift (电梯最短路径问题)

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  5. UVa 11997 K Smallest Sums 优先队列&amp;&amp;打有序表&amp;&amp;归并

    UVA - 11997 id=18702" target="_blank" style="color:blue; text-decoration:none&qu ...

  6. poj 3666 河南省第七届程序设计D题(山区修路)

    题目大意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,求最小的变动价值:需要用到离散化dp 状态转移方程: dp[i][j]=abs(j-w[i])+min(dp[i-1][k]);(k ...

  7. html 标签 图片

    <img src="e:/image/a.png"/> 在html中,图片是一个字符. <img src=" e:/image/a.png" ...

  8. Mockito - Wanted but not invoked: Actually, there were zero interactions with this mock

    要测试的类:IndexController.java 代码: @Mock private TemplateWrapper templateWrapper = spy(new TemplateWrapp ...

  9. ServletContext与Web应用以及Spring容器启动

    一.ServletContext对象获取Demo Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象. 可以把ServletContext看作一个 ...

  10. Help Hanzo lightof 1197 求一段区间内素数个数,[l,r] 在 [1,1e9] 范围内。r-l<=1e5; 采用和平常筛素数的方法。平移区间即可。

    /** 题目:Help Hanzo lightof 1197 链接:https://vjudge.net/contest/154246#problem/M 题意:求一段区间内素数个数,[l,r] 在 ...