Website Summary Files Commits Branches @commit @diff @stats
path: root / Seminar10 / src / lru-cache.cpp
diff options
context:
space:
mode:
Commit3c72a02284dad4ddd9df1ff6910ed1a0a4550a30 (patch)
Author
 Stoycho Kyosev <stoycho.kk@gmail.com>
2024-12-22 13:19:05 -0500
Committer
 Stoycho Kyosev <stoycho.kk@gmail.com>
2024-12-22 13:19:05 -0500
Filese5921b4ff115ae1a1cd570559ea539ecae5a0962 /Seminar10/src/lru-cache.cpp
Data-structures-and-algorithms-3c72a02284dad4ddd9df1ff6910ed1a0a4550a30.tar
Data-structures-and-algorithms-3c72a02284dad4ddd9df1ff6910ed1a0a4550a30.tar.gz
Data-structures-and-algorithms-3c72a02284dad4ddd9df1ff6910ed1a0a4550a30.zip
Parentd8fb59b4d45197c9b3a2b100a3d94b1c2e92b2ef (diff)
Add seminar 10 and 11
1 files changed, 45 insertions, 0 deletions
-rw-r--r--Seminar10/src/lru-cache.cpp45
diff --git a/Seminar10/src/lru-cache.cpp b/Seminar10/src/lru-cache.cpp
new file mode 100644
index 0000000..d199eb1
--- /dev/null
+++ b/Seminar10/src/lru-cache.cpp
@@ -0,0 +1,45 @@
+#include <list>
+#include <unordered_map>
+#include <stdexcept>
+
+class LRUCache
+{
+ size_t capacity;
+ std::list<std::pair<int, int>> data;
+ std::unordered_map<int, std::list<std::pair<int, int>>::iterator> dataMap;
+
+public:
+ LRUCache(size_t capacity) : capacity(capacity) { }
+
+ int get(int key)
+ {
+ if (dataMap.find(key) == dataMap.end())
+ {
+ throw std::runtime_error("Data not in cache");
+ }
+
+ auto it = dataMap[key];
+
+ // Transfers elements from one list to another.
+ // No elements are copied or moved, only the internal pointers of the list nodes are re-pointed.
+ data.splice(data.begin(), data, it);
+ return it->second;
+ }
+
+ void put(int key, int value)
+ {
+ if (dataMap.find(key) != dataMap.end())
+ {
+ auto it = dataMap[key];
+ data.erase(it);
+ }
+
+ data.push_front({ key, value });
+ dataMap[key] = data.begin();
+ if (data.size() > capacity)
+ {
+ dataMap.erase(data.back().first);
+ data.pop_back();
+ }
+ }
+}; \ No newline at end of file