// A simple LRU cache written in C++ // Hash map + doubly linked list #include #include #include using namespace std; using namespace __gnu_cxx; template struct Node{ K key; T data; Node *prev, *next; }; template class LRUCache{ public: LRUCache(size_t size){ entries_ = new Node[size]; for(int i=0; i; tail_ = new Node; head_->prev = NULL; head_->next = tail_; tail_->prev = head_; tail_->next = NULL; } ~LRUCache(){ delete head_; delete tail_; delete[] entries_; } void Put(K key, T data){ Node *node = hashmap_[key]; if(node){ // node exists detach(node); node->data = data; attach(node); } else{ if(free_entries_.empty()){// 可用结点为空,即cache已满 node = tail_->prev; detach(node); hashmap_.erase(node->key); } else{ node = free_entries_.back(); free_entries_.pop_back(); } node->key = key; node->data = data; hashmap_[key] = node; attach(node); } } T Get(K key){ Node *node = hashmap_[key]; if(node){ detach(node); attach(node); return node->data; } else{// 如果cache中没有,返回T的默认值。与hashmap行为一致 return T(); } } private: // 分离结点 void detach(Node* node){ node->prev->next = node->next; node->next->prev = node->prev; } // 将结点插入头部 void attach(Node* node){ node->prev = head_; node->next = head_->next; head_->next = node; node->next->prev = node; } private: hash_map* > hashmap_; vector* > free_entries_; // 存储可用结点的地址 Node *head_, *tail_; Node *entries_; // 双向链表中的结点 }; int main(){ hash_map map; map[9]= 999; cout< lru_cache(100); lru_cache.Put(1, "one"); cout<