3636#include < stdio.h>
3737#include < stdlib.h>
3838#include < string.h>
39+ #include < map>
40+
41+ using namespace std ;
3942
4043namespace alg {
41- class LRUCache {
44+
45+ template <typename K,typename V>
46+ class LRUCache
47+ {
4248typedef struct _Node_ {
43- int key;
44- int value;
49+ K key;
50+ V value;
4551
4652struct _Node_ *next;
4753struct _Node_ *pre ;
4854
4955} CacheNode;
50-
51- public:
56+
57+ public:
5258LRUCache (int cache_size=10 ) {
5359cache_size_ = cache_size;
54- cache_real_size_ = 0 ;
5560p_cache_list_head = new CacheNode ();
5661p_cache_list_near = new CacheNode ();
5762p_cache_list_head->next = p_cache_list_near;
5863p_cache_list_head->pre = NULL ;
5964p_cache_list_near->pre = p_cache_list_head;
6065p_cache_list_near->next = NULL ;
66+
6167}
62-
68+
69+
6370~LRUCache () {
6471CacheNode *p;
6572p = p_cache_list_head->next ;
@@ -69,82 +76,106 @@ namespace alg {
6976}
7077
7178delete p_cache_list_near;
79+ cache_hash.clear ();
7280}
73-
74- int getValue (int key) {
75- CacheNode *p=p_cache_list_head->next ;
76- while (p->next !=NULL ) {
77- if (p->key == key) { // catch node
78- detachNode (p);
79- addToFront (p);
80- return p->value ;
81- }
82- p=p->next ;
81+
82+
83+
84+ V getValue (K key) {
85+ // put the value in front of the list if find the key
86+ if (cache_hash.find (key) != cache_hash.end ()){
87+ CacheNode *p=cache_hash[key];
88+ detachNode (p);
89+ addFristNode (p);
90+ return (cache_hash[key]->value );
91+ }else {
92+
93+ cout << " [ERROR]No key with name ::" << key << endl;
94+ return V ();
8395}
84- return -1 ;
85- }
8696
87- bool putValue (int key,int value) {
88- CacheNode *p=p_cache_list_head->next ;
89- while (p->next !=NULL ) {
90- if (p->key == key) { // catch node
91- p->value =value;
92- getValue (key);
93- return true ;
94- }
95- p=p->next ;
96- }
97+ }
98+
99+
100+
101+
102+ bool putValue (K key,V value) {
103+ if (cache_hash.find (key) != cache_hash.end ()){
104+ cache_hash[key]->value =value;
105+ detachNode ((CacheNode *)cache_hash[key]);
106+ addFristNode ((CacheNode *)cache_hash[key]);
107+ if (cache_hash.size ()>cache_size_){
108+ delEndNode ();
109+ }
110+ }else {
111+ CacheNode *p=new CacheNode ();
112+ p->key =key;
113+ p->value =value;
114+ addFristNode (p);
115+ cache_hash[key]=p;
116+ if (cache_hash.size ()>cache_size_){
117+ cout << " [INFO]LRU Cache is full ... Delete Last One..." << endl;
118+ delEndNode ();
119+ }
120+
97121
98- if (cache_real_size_ >= cache_size_) {
99- std::cout << " free" <<std::endl;
100- p=p_cache_list_near->pre ->pre ;
101- delete p->next ;
102- p->next =p_cache_list_near;
103- p_cache_list_near->pre =p;
104122}
105-
106- p = new CacheNode ();// (CacheNode *)malloc(sizeof(CacheNode));
107-
108- if (p==NULL )
109- return false ;
110-
111- addToFront (p);
112- p->key =key;
113- p->value =value;
114-
115- cache_real_size_++;
116-
123+
117124return true ;
118125}
119-
120- void displayNodes () {
126+
127+
128+
129+
130+
131+ void display (){
121132CacheNode *p=p_cache_list_head->next ;
122-
123133while (p->next !=NULL ) {
124- std::cout << " Key : " << p->key << " Value : " << p->value << std::endl;
134+ std::cout << " KEY[ " << p->key << " ]<==>VALUE[ " << p->value << " ] " << std::endl;
125135p=p->next ;
126-
127136}
128- std::cout << std::endl;
137+ std::cout << std::endl;
129138}
130-
131- private:
139+
140+ private:
132141int cache_size_;
133- int cache_real_size_;
134142CacheNode *p_cache_list_head;
135143CacheNode *p_cache_list_near;
136-
137- void detachNode (CacheNode *node) {
144+ map<K,CacheNode*>cache_hash;
145+
146+
147+ void detachNode (CacheNode *node){
138148node->pre ->next =node->next ;
139- node->next ->pre =node->pre ;
149+ node->next ->pre =node->pre ;
140150}
141-
142- void addToFront (CacheNode *node) {
143- node->next =p_cache_list_head->next ;
144- p_cache_list_head->next ->pre =node;
145- p_cache_list_head->next =node;
146- node->pre =p_cache_list_head;
151+
152+
153+ void addFristNode (CacheNode *node){
154+ node->pre =p_cache_list_head;
155+ if (cache_hash.empty ())
156+ {
157+ node->next =p_cache_list_near;
158+ p_cache_list_near->pre =node;
159+ p_cache_list_head->next =node;
160+ }else
161+ {
162+ node->next =p_cache_list_head->next ;
163+ p_cache_list_head->next ->pre =node;
164+ p_cache_list_head->next =node;
165+ }
166+ }
167+
168+
169+
170+ void delEndNode (){
171+ CacheNode *p=p_cache_list_near->pre ;
172+ detachNode (p);
173+ cout << " [INFO]Delete key ::: " << p->key <<endl;
174+ cache_hash.erase (p->key );
175+ free (p);
176+
147177}
178+
148179};
149180}
150181
0 commit comments