简洁高效的LRU Map C++实现
来源:互联网 发布:多益网络招聘学历要求 编辑:程序博客网 时间:2024/06/03 09:13
LRU是缓存替换的一个重要原则。其思想可以广泛的应用于很多场合。通过维护一个Key和Timestamp之间的双向映射,可以实现一个简洁高效的通用LRU Map。
1: #include <map>
2: #include <string>
3: #include <iostream>
4: using namespace std;
5:
6: template<class K, class V>
7: struct lrumap:public map<K, V>
8: {
9: typedef map<K, V> base_type;
10: typedef size_t timestamp;
11: typedef typename map<K, timestamp> K2T;
12: typedef typename map<timestamp, K> T2K;
13:
14: K2T k2t; // from key to timestamp
15: T2K t2k; // from timestamp to key
16:
17: timestamp tm;
18: size_type capacity;
19: lrumap(size_type cap=10)
20: : tm(1), capacity(cap) {}
21:
22: V& operator[](const K& k)
23: {
24: timestamp& _tm=k2t[k];
25: if(_tm) // if the timestamp already exist, delete it from t2k
26: t2k.erase(_tm);
27: _tm=tm++; // update timestamp in k2t
28: t2k[_tm]=k; // update key in t2k
29:
30: V& ret= base_type::operator[](k);
31:
32: // remove the oldest if necessary
33: if(size()>capacity)
34: {
35: K k=t2k.begin()->second; // get the eldest key
36: erase(k);
37: }
38: return ret;
39: }
40: void erase(const K& k)
41: {
42: // erase timestamp <-> key reference
43: t2k.erase(k2t[k]);
44: k2t.erase(k);
45: // then the actual data
46: base_type::erase(k);
47: }
48: };
在这个实现中,当lrumap增长到等于capacity时,会出现频繁的在map中插入/删除节点的情况。大量的动态内存分配/释放会严重影响程序性能。配合pool_allocator会大大的提高这个LRU map的性能,使其成为一个真正有用的LRU map。
- 简洁高效的LRU Map C++实现
- 简洁高效的数据库连接池
- DrawerLayout实现侧滑(简洁,高效)
- C语言实现LRU缓存
- LRU算法的实现
- LRU算法的实现
- LRU的实现
- LRU算法的实现
- LRU算法的实现
- LRU算法的实现
- LRU cache的实现
- LRU算法的实现
- LRU Cache的实现
- LRU的C++实现
- Java LRU的实现
- LRU算法的实现
- LRU Cache的实现
- LRU队列的实现
- stm32f407之DAC(操作寄存器)
- Android轩辕剑之ActionBar之一
- 从内存中加载png<摘自MFC源码>
- 黑马程序员 Math对象
- 如何让电脑在待机时不断网呢?
- 简洁高效的LRU Map C++实现
- stm32f407之高级定时器 死区互补PWM(操作寄存器)
- QuickReport Delphi7完全解决方案
- codeforces 327 B. Hungry Sequence
- 对 JavaScript 下 namespace 功能的简单分析
- stm32f407之PWM(操作寄存器)
- 构造函数为什么不能是虚函数
- linux lsof详解
- stm32f407之基本定时器TIM6&TIM7(操作寄存器)