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