LRU缓存C++实现

LRU Cache C++ Implementation

本文关键字:实现 C++ 缓存 LRU      更新时间:2023-10-16

问题

设计并实现了一个用于最近最少使用(LRU)缓存的数据结构。它应该支持以下操作:get和set。

get(key)-如果缓存中存在密钥,则获取该密钥的值(将始终为正),否则返回-1。

set(key, value)-如果密钥不存在,则设置或插入该值。当缓存达到其容量时,它应该在插入新项之前使最近使用最少的项无效。

我的程序

class LRUCache {
public:
    LRUCache(int capacity) {
        LRUCache::capacity = capacity;
        len = 0;
    }
    int get(int key) {
        if (table.find(key) != table.end()) {
            removeNode(table[key]);
            setHead(table[key]);
            return table[key]->value;
        } else {
            return -1;
        }
    }
    void set(int key, int value) {
        if(table.find(key) != table.end()) {
            ListNode *curr = table[key];
            curr->value = value;
            removeNode(curr);
            setHead(curr);
        } else {
            ListNode *curr = new ListNode(key, value);
            if(len < capacity) {
                setHead(curr);
                table[key] = curr;
                len++;
            } else {
                ListNode *tmp = tail;
                tail = tail->prev;
                if(tail) {
                    tail->next = nullptr;
                }
                table.erase(tmp->key);
                delete tmp;
                setHead(curr);
                table[key] = curr;
            }
        }
    }
private:
    struct ListNode {
        int key, value;
        ListNode *prev, *next;
        ListNode(int key, int value)
            : key(key)
            , value(value)
            , prev(nullptr)
            , next(nullptr) {
        }
    };
    unordered_map<int, ListNode*> table;
    ListNode *head, *tail;
    int capacity;
    int len;
    void removeNode(ListNode *node) {
        if(node->prev) {
            node->prev->next = node->next;
        } else {
            head = node->next;
        }
        if(node->next) {
            node->next->prev = node->prev;
        } else {
            tail = node->prev;
        }
    }
    void setHead(ListNode *node) {
        node->next = head;
        node->prev = nullptr;
        if(head) {
            head->prev = node;
        }
        head = node;
        if(!tail) {
            tail = node;
        }
    }
};

样本输入:

1 // capacity
2 1 // set(int, int)
1 // get(int)

我的机器中的输出:

-1

在线判断编译器中的输出:

运行时错误

到底出了什么问题?问题出在Leetcode上。

您没有初始化headtail,因此它们的值不确定。如果这些值恰好为null,那么程序将按照您的期望工作;否则,任何事情都有可能发生。

像Valgrind这样的运行时分析工具非常适合查找这样的错误。