109 lines
2.5 KiB
C++
109 lines
2.5 KiB
C++
#include <iostream>
|
|
#include <vector>
|
|
#include <map>
|
|
#define RES_MAX 5
|
|
using namespace std;
|
|
|
|
struct list
|
|
{
|
|
list *next = NULL;
|
|
int k = 0;
|
|
};
|
|
|
|
class Mem
|
|
{
|
|
public:
|
|
int get(int k)
|
|
{
|
|
if (memcache.find(k) != memcache.end())
|
|
{
|
|
// cache hit: update visit list
|
|
for (list **node = &visit; *node; node = &((*node)->next))
|
|
{
|
|
if ((*node)->k == k)
|
|
{
|
|
list *found = *node;
|
|
*node = (*node)->next;
|
|
found->next = visit;
|
|
visit = found;
|
|
break;
|
|
}
|
|
}
|
|
return memcache.find(k)->second;
|
|
}
|
|
else
|
|
{
|
|
// cache miss:
|
|
if (memcache.size() < RES_MAX)
|
|
{
|
|
// if cache available: update visit list; update memcache
|
|
list *node = new list;
|
|
node->k = k;
|
|
node->next = visit;
|
|
visit = node;
|
|
memcache.emplace(k, 0);
|
|
}
|
|
else
|
|
{
|
|
// if cache full: swap out oldest memcache; rm oldest visit; update visit
|
|
for (list **node = &visit; *node; node = &(*node)->next)
|
|
{
|
|
if ((*node)->next == NULL)
|
|
{
|
|
memcache.erase(memcache.find((*node)->k));
|
|
delete *node;
|
|
*node = NULL;
|
|
memcache.emplace(k, 0);
|
|
break;
|
|
}
|
|
}
|
|
list *node = new list;
|
|
node->k = k;
|
|
node->next = visit;
|
|
visit = node;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
int set(int k, int v)
|
|
{
|
|
if (get(k) != v)
|
|
{
|
|
memcache.find(k)->second = v;
|
|
}
|
|
return memcache.find(k)->second;
|
|
}
|
|
void print()
|
|
{
|
|
for (const auto &byte : memcache)
|
|
{
|
|
cout << byte.first << ": " << byte.second << endl;
|
|
}
|
|
for (list *node = visit; node; node = node->next)
|
|
{
|
|
cout << " -> " << node->k;
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
private:
|
|
map<int, int> memcache;
|
|
list *visit = NULL;
|
|
};
|
|
|
|
int main()
|
|
{
|
|
Mem mem;
|
|
for (int i = 10; i > 0; i--)
|
|
{
|
|
mem.get(i);
|
|
}
|
|
for (int i = 4; i < 7; i++)
|
|
{
|
|
if (mem.set(i, i) != i)
|
|
{
|
|
cout << "insert " << i << " failed" << endl;
|
|
}
|
|
}
|
|
mem.print();
|
|
} |