#include #include #include #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 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(); }