C++实现的常见缓存算法和LRU
在计算机科学中,缓存算法是一种用于管理缓存的算法,以提高数据访问速度和性能。C++是一种常用的编程语言,也支持缓存算法的实现。本文将详细介绍C++实现的常见缓存算法和LRU。
常见缓存算法
先进先出(FIFO)
先进先出(FIFO)是一种最简单的缓存算法,它按照数据进入缓存的顺序来淘汰数据。C++可以通过使用queue
容器来实现FIFO缓存算法。
以下是一个使用FIFO缓存算法的示例:
#include <iostream>
#include <queue>
using namespace std;
int main() {
// 创建一个队列作为缓存
queue<int> cache;
// 缓存容量为3
int capacity = 3;
// 添加数据到缓存
cache.push(1);
cache.push(2);
cache.push(3);
// 缓存已满,添加新数据时淘汰最早的数据
if (cache.size() == capacity) {
cache.pop();
}
// 输出缓存中的数据
while (!cache.empty()) {
cout << cache.front() << " ";
cache.pop();
}
cout << endl;
return 0;
}
上述代码中,使用queue
容器来实现FIFO缓存算法,当缓存容量已满时,添加新数据时会淘汰最早的数据。
最近最少使用(LRU)
最近最少使用(LRU)是一种常用的缓存算法,它淘汰最近最少使用的数据。C++可以通过使用list
和unordered_map
容器来实现LRU缓存算法。
以下是一个使用LRU缓存算法的示例:
#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
class LRUCache {
public:
LRUCache(int capacity) {
this->capacity = capacity;
}
int get(int key) {
// 如果key不存在,返回-1
if (cache_map.find(key) == cache_map.end()) {
return -1;
}
// 如果key存在,将key移到链表头部,并返回value
cache_list.splice(cache_list.begin(), cache_list, cache_map[key]);
return cache_map[key]->second;
}
void put(int key, int value) {
// 如果key已存在,将key移到链表头部,并更新value
if (cache_map.find(key) != cache_map.end()) {
cache_map[key]->second = value;
cache_list.splice(cache_list.begin(), cache_list, cache_map[key]);
return;
}
// 如果key不存在,添加新的key-value对
cache_list.push_front(make_pair(key, value));
cache_map[key] = cache_list.begin();
// 如果缓存容量已满,淘汰最近最少使用的数据
if (cache_map.size() > capacity) {
cache_map.erase(cache_list.back().first);
cache_list.pop_back();
}
}
private:
int capacity;
list<pair<int, int>> cache_list;
unordered_map<int, list<pair<int, int>>::iterator> cache_map;
};
int main() {
// 创建一个LRU缓存,容量为3
LRUCache cache(3);
// 添加数据到缓存
cache.put(1, 1);
cache.put(2, 2);
cache.put(3, 3);
// 获取缓存中的数据
cout << cache.get(1) << endl; // 输出1
// 添加新数据到缓存,淘汰最近最少使用的数据
cache.put(4, 4);
// 获取缓存中的数据
cout << cache.get(2) << endl; // 输出-1
return 0;
}
上述代码中,使用list
和unordered_map
容器来实现LRU缓存算法,当缓存容量已满时,添加新数据时会淘汰最近最少使用的数据。
示例说明
以下是一个使用LRU缓存算法的完整示例:
#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
class LRUCache {
public:
LRUCache(int capacity) {
this->capacity = capacity;
}
int get(int key) {
// 如果key不存在,返回-1
if (cache_map.find(key) == cache_map.end()) {
return -1;
}
// 如果key存在,将key移到链表头部,并返回value
cache_list.splice(cache_list.begin(), cache_list, cache_map[key]);
return cache_map[key]->second;
}
void put(int key, int value) {
// 如果key已存在,将key移到链表头部,并更新value
if (cache_map.find(key) != cache_map.end()) {
cache_map[key]->second = value;
cache_list.splice(cache_list.begin(), cache_list, cache_map[key]);
return;
}
// 如果key不存在,添加新的key-value对
cache_list.push_front(make_pair(key, value));
cache_map[key] = cache_list.begin();
// 如果缓存容量已满,淘汰最近最少使用的数据
if (cache_map.size() > capacity) {
cache_map.erase(cache_list.back().first);
cache_list.pop_back();
}
}
private:
int capacity;
list<pair<int, int>> cache_list;
unordered_map<int, list<pair<int, int>>::iterator> cache_map;
};
int main() {
// 创建一个LRU缓存,容量为3
LRUCache cache(3);
// 添加数据到缓存
cache.put(1, 1);
cache.put(2, 2);
cache.put(3, 3);
// 获取缓存中的数据
cout << cache.get(1) << endl; // 输出1
// 添加新数据到缓存,淘汰最近最少使用的数据
cache.put(4, 4);
// 获取缓存中的数据
cout << cache.get(2) << endl; // 输出-1
return 0;
}
上述代码中,使用list
和unordered_map
容器来实现LRU缓存算法,当缓存容量已满时,添加新数据时会淘汰最近最少使用的数据。
总结
本文介绍了C++实现的常见缓存算法和LRU,包括先进先出(FIFO)和最近最少使用(LRU)。了解这些算法可以帮助我们更好地优化程序性能和提高用户体验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++实现的常见缓存算法和LRU - Python技术站