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


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

  • 相关阅读:

    转:在自己的工具条中使用ArcGIS Engine提供的命令和工具
    配置Subversion Apache TortoiseSVN
    vc++2005移除自定义向导目录
    NetAdvantage2006 For ASP.NET2.0印象
    三天了!今天终于成功安装ArcIMS9.2!
    vss 去除源代码管理
    转:设计模式趣谈
    转一篇:有关项目报告
    演练:使用 Visual Studio Team Test 进行单元测试
  • 原文地址:https://www.cnblogs.com/findumars/p/11161091.html
Copyright © 2020-2023  润新知