LRU Cache C ++实现

时间:2014-09-11 09:32:09

标签: c++ caching

问题

设计并实现最近最少使用(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

在线评判编译器的输出:

运行时错误

实际上有什么不对? The problem is of Leetcode

1 个答案:

答案 0 :(得分:3)

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

Valgrind这样的运行时分析工具很适合发现这样的错误。