C++实现一个LRU缓存

#include <iostream>
#include <unordered_map>
#include <list>

using namespace std;

class LRUCache {
private:
    int capacity;
    unordered_map<int, pair<int, list<int>::iterator>> cache;
    list<int> lru;

public:
    LRUCache(int capacity) {
        this->capacity = capacity;
    }

    int get(int key) {
        if (cache.find(key) == cache.end()) {
            return -1;
        }
        
        // 将访问的元素移动到最前面
        lru.splice(lru.begin(), lru, cache[key].second);
        
        return cache[key].first;
    }

    void put(int key, int value) {
        if (cache.find(key) == cache.end()) {
            if (cache.size() == capacity) {
                // 移除最久未使用的元素
                cache.erase(lru.back());
                lru.pop_back();
            }
            lru.push_front(key);
        }
        else {
            lru.splice(lru.begin(), lru, cache[key].second);
        }

        cache[key] = make_pair(value, lru.begin());
    }
};

int main() {
    LRUCache cache(2);

    cache.put(1, 1);
    cache.put(2, 2);
    cout << cache.get(1) << endl;  // 输出 1

    cache.put(3, 3);
    cout << cache.get(2) << endl;  // 输出 -1

    cache.put(4, 4);
    cout << cache.get(1) << endl;  // 输出 -1
    cout << cache.get(3) << endl;  // 输出 3
    cout << cache.get(4) << endl;  // 输出 4
    
    return 0;
}

        这里使用了unordered_map来存储key和value的映射关系,以及每个key对应的list中的迭代器。list则存储了访问的顺序,最前面的元素是最近访问的,最后面的元素是最久未使用的。当插入新元素时,如果容量已满,则移除最久未使用的元素;当访问某个元素时,将其移动到最前面。这样就能保证LRU缓存的特性。

相关推荐

  1. C++实现一个LRU缓存

    2024-02-07 13:58:03       24 阅读
  2. C# 实现Lru缓存

    2024-02-07 13:58:03       34 阅读
  3. go语言实现LRU缓存

    2024-02-07 13:58:03       28 阅读
  4. LeetCode的LRU缓存实现

    2024-02-07 13:58:03       14 阅读
  5. 设计一个LRU(最近最少使用)缓存

    2024-02-07 13:58:03       28 阅读
  6. 通过对象轮换实现 LRU 缓存结构

    2024-02-07 13:58:03       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-07 13:58:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-07 13:58:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-07 13:58:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-07 13:58:03       18 阅读

热门阅读

  1. abc339(A-C)

    2024-02-07 13:58:03       37 阅读
  2. Vite 下一代的前端工具链,前端开发与构建工具

    2024-02-07 13:58:03       34 阅读
  3. ClickHouse表常用引擎

    2024-02-07 13:58:03       29 阅读
  4. clickhouse清理日志。

    2024-02-07 13:58:03       32 阅读
  5. 车载系统相关

    2024-02-07 13:58:03       30 阅读
  6. 深入Elasticsearch:线程池的原理与应用

    2024-02-07 13:58:03       31 阅读