146.LRU Cache


// Acception of mine Jacob
typedef struct my_val my_val_t;
struct my_val {
int key;
int val;
my_val_t* pre;
my_val_t* next;
my_val(int v) { val = v;pre = NULL; next = NULL; };
my_val(int key, int v) { key = key;val = v;pre = NULL; next = NULL; };
};


class LRUCache {
public:
LRUCache(int capacity) {
m_capacity = capacity;
m_node = (my_val_t*)malloc(sizeof(my_val_t));
m_node->pre = m_node;
m_node->next = m_node;
}


int get(int key) {
if (m_data.count(key))
{
my_val_t* p = m_data[key];
int ans = p->val;


getoffNode(p);
insertNodeTofirst(p);


return ans;
}
else
{
return -1;
}
}


void put(int key, int value) {
//set
if (m_data.count(key))
{
my_val_t* p = m_data[key];
p->val = value;


getoffNode(p);
insertNodeTofirst(p);


}
//insert
else
{
my_val_t* p = (my_val_t*)malloc(sizeof(my_val_t));
p->val = value;
p->key = key;


if (m_data.size() >= m_capacity)
{
//delete the last node
my_val_t* qLast = m_node->pre;
getoffNode(qLast);


int key = qLast->key;
m_data.erase(key);free(qLast);qLast->pre = NULL;



qLast->next = NULL;
qLast = NULL;//insert the new node to the first                insertNodeTofirst(p);}else{//insert the new node to the first double queueinsertNodeTofirst(p);}// insert into mapm_data[key] = p;}};private:void getoffNode(my_val_t* p){p->pre->next = p->next;p->next->pre = p->pre;};void insertNodeTofirst(my_val_t* p){p->next = m_node->next;m_node->next->pre = p;m_node->next = p;p->pre = m_node;}map<int, my_val_t*> m_data;my_val_t* m_node;




































int         m_capacity;
};

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326263889&siteId=291194637