leveldb -- 2 [LRUCache C++ 实现]
来源:互联网 发布:淘宝微信优惠小助手 编辑:程序博客网 时间:2024/05/14 20:06
在看leveldb实现过程中发现小和尚的藏经阁里提到 LRUCache,翻书,发现是内存的普遍实现。
Cache有种实现:hit一次就让计数器+1,这样需要覆盖,就找count最少的。每次都需要轮询,效率低。所以LRUCache就出来了
C++实现 这里已经有很好的实现了 如何用C++实现一个LRU Cache
我下面就是抄了一遍。是的,抄了一遍,关键要记住
//A simple LRUCache demo//double linked list + hashmap#include <iostream>#include <cassert>#include <vector>#include <ext/hash_map>using namespace std;using namespace __gnu_cxx;template< class K, class T>struct Node{ K key; T value; Node *prev,*next;};template< class K, class T>class LRUCache {public: LRUCache(size_t size){ entries_ = new Node<K,T>[size]; for(int i=0;i<size;i++) free_entries_.push_back(entries_+i); head_ = new Node<K,T>; tail_ = new Node<K,T>; head_->prev = NULL; head_->next = tail_; tail_->prev = head_; tail_->next = NULL; } ~LRUCache(){ delete head_; delete tail_; delete[] entries_; } T Get(K key){ Node<K,T>* node = hashmap_[key]; if(node){ detach(node); attach(node); return node->value; } else{ return T(); } } void Put(K key, T value){ Node<K,T> *node = hashmap_[key]; if(node){//node exist detach(node); node->value = value; attach(node); }else{ if(free_entries_.empty()){//cache full node = tail_->prev; detach(tail_->prev); hashmap_.erase(node->key); }else{ //cache available node = free_entries_.back(); free_entries_.pop_back(); } node->key = key; node->value = value; hashmap_[key] = node; attach(node); } }private: Node<K,T> *head_,*tail_; Node<K,T> *entries_; hash_map<K, Node<K,T>* > hashmap_; vector<Node<K,T>* > free_entries_; void detach(Node<K,T>* node){ node->next->prev = node->prev; node->prev->next = node->next; } void attach(Node<K,T>* node){ node->prev = head_; node->next = head_->next; head_->next = node; head_->next->prev = node; }};int main(int argc, char* argv[]){ hash_map<int,int> map; map[9]= 999; cout<<map[9]<<endl; cout<<map[10]<<endl; LRUCache<int,string> lruCache(100); lruCache.Put(1,"hello"); cout<<lruCache.Get(1)<<endl; if(lruCache.Get(2) == ""){ cout<<"Put 2!"<<endl; lruCache.Put(2,"world"); } cout<<lruCache.Get(2)<<endl; return 0;}
0 0
- leveldb -- 2 [LRUCache C++ 实现]
- 【转载】leveldb中的LRUCache设计
- leveldb源码解析6——Cache之LRUCache实现详解
- levelDB源码分析-Cache(LRUCache、HashTable)
- LruCache实现
- LevelDB源码剖析之Cache(HashTable LRUCache ShardedLRUCache)
- LevelDb日知录(Leveldb 实现原理)
- 【leveldb】Leveldb实现原理分析(上)
- LRUCache算法实现
- LRUCache初步实现
- LinkedHashMap与LRUCache实现
- LruCache实现原理
- LruCache,DiskLruCache实现分析
- LruCache 实现原理分析
- LruCache 实现原理分析
- 自己实现LRUCache
- LRUCache的实现原理
- LRUCache-c++实现
- 《MFC Windows程序设计》第18章(1):COM
- Visual C++ 2012入门经典(第6版) 课后练习(第05章)
- 维基oi 3085 相同的后三位
- 成员函数做for_each 参数
- 数论模板
- leveldb -- 2 [LRUCache C++ 实现]
- ReportStudio入门教程(七十二) - 显示时间进度(进度条版)
- IO端口和IO内存的区别及分别使用的函数接口
- PHP session的详细分析
- Servlet过滤器
- IOS 动画
- 【机房重构】SQl之存储过程
- 水文方向顶级期刊
- 【不规则时尚】my love大气质设计!疯狂时尚达人秀