stout中实现了LRU cache。cache的成员如下:

public:
typedef std::list<Key> list;
typedef std::tr1::unordered_map<
Key, std::pair<Value, typename list::iterator> > map;

  可以看到map的第二项除了value之外,又有一个指向key的迭代器,这种设计有利于提高cache LRU操作的效率:当查询某个key时,同时获取value和key在list中的迭代器,可方便的将该key和ist中最后一个元素进行交换,如下所示: 

void use(const typename map::iterator& i)
{
// Move the "pointer" to the end of the lru list.
keys.splice(keys.end(), keys, (*i).second.second); // Now update the "pointer" so we can do this again.
(*i).second.second = --keys.end();
}

  这里使用了list.splice交换两个元素的位置。splice的用法如下:

#include <list>
#include <iostream>
#include <algorithm> int main()
{
std::list<int> a = {, , , };
for_each(begin(a), end(a), [](int n){std::cout << n << std::endl;}); a.splice(end(a), a, begin(a));
for_each(begin(a), end(a), [](int n){std::cout << n << std::endl;});
return ;

  关于LRU cache的使用,示例代码如下:

  

#include "stout/cache.hpp"
#include <iostream>
#include <string> int main()
{
Cache<int, std::string> a();
a.put(, "one");
a.put(, "two");
a.put(, "three");
std::cout << a << std::endl; a.get();
std::cout << a << std::endl; a.put(, "four");
std::cout << a << std::endl;
return ;
}

  注:在使用过程中发现cache重载<<操作符的一个编译错误,

template <typename Key, typename Value>
std::ostream& operator << (
std::ostream& stream,
const cache<Key, Value>& c)
{
typename cache<Key, Value>::list::const_iterator i1;
for (i1 = c.keys.begin(); i1 != c.keys.end(); i1++) {
stream << *i1 << ": ";
typename cache<Key, Value>::map::const_iterator i2;
i2 = c.values.find(*i1);
CHECK(i2 != c.values.end());
stream << *i2 << std::endl;
}
return stream;
}

  解决方法:将倒数第三行的

stream << *i2 << std::endl;

  改成

stream << i2->second.first << std::endl;

  即可。

  

最新文章

  1. spring笔记3 spring MVC的基础知识3
  2. IOS- 数据存储
  3. PowerDesigner生成sql及HTML格式数据库文档
  4. hadoop debug script
  5. Gym 100801A Alex Origami Squares (求正方形边长)
  6. DB、ETL、DW、OLAP、DM、BI关系结构图
  7. EDIUS和VEGAS哪个更好用
  8. maven中使用net.sf.json-lib
  9. codevs2492 上帝造题的七分钟 2
  10. 三种root的修补方式
  11. [Python 3.x 官方文档翻译]Whetting Your Appetite 欢迎您的使用
  12. 【Howie玩docker】-使用mono编译c#程序
  13. Jquery的parent和parents(找到某一特定的祖先元素)
  14. POJ1275出纳员的雇佣【差分约束】
  15. 使用JPA和Hibernate进行批量处理的最佳方式
  16. H5 拖拽,一个函数搞定,直接指定对象设置可拖拽
  17. 图论分支-差分约束-SPFA系统
  18. docker-使用Dockerfile制作镜像
  19. xdoj-1057(Lucas定理的证明及其模板)
  20. python3.4连接mysql5.7数据库增删改查

热门文章

  1. Android开发-API指南-&lt;receiver&gt;
  2. gitolite 丢失管理密钥/访问权限 解决办法
  3. 使用truffle测试部署合约
  4. javascript打开新窗口
  5. VBA基础之Excel VBA 表格的操作(一)
  6. lintcode-42-最大子数组 II
  7. iOS如何做出炫酷的翻页效果
  8. Css入门课程 Css文本样式
  9. 软工网络15团队作业4——Alpha阶段敏捷冲刺-3
  10. try catch finally 与continue的使用