用C++实现一个LRU cache

本文介绍了一种使用Boost库和双向链表实现的LRU(Least Recently Used)缓存机制。该实现支持基本的获取(get)和放置(put)操作,并通过一个固定大小的双向链表来维护缓存项的访问顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <boost/unordered_map.hpp>

#define DEFAULT_LRU_CAPACITY 10000

template<class K, class V>
class LRUCache
{
	struct Node
	{
		K key;
		V value;
		Node *prev, *next;

		Node(const K& key, const V& value)
			: key(key)
			, value(value)
		{
			prev = next = NULL;
		}

		Node()
		{
		}
	};
public:
	LRUCache(std::size_t size = DEFAULT_LRU_CAPACITY)
		: size_(size)
	{
//		Mutex::Lock autolock(lock);
		assert(size > 0);
		head_ = new Node;
		head_->next = head_;
		head_->prev = head_;//circle
	}

	int get(const K& k, V& v)
	{
//		Mutex::Lock autolock(lock);
		boost::unordered_map<K, Node*>::const_iterator iter = elems_.find(k);
		if (iter == elems_.end()) {
			cout << "get, cannot find:" << k << endl;
			return -1; //can't find
		}

		Node* node = iter->second;
		if (head_->next != node) {
			detatch(node);
			attach(node);
		}
		v = node->value;

		return 0;
	}

	int put(const K key, const V& value)
	{
//		Mutex::Lock autolock(lock);
		if (elems_.find(key) != elems_.end()) {
			return -1; //not unique
		}
		if (elems_.size() >= size_)
		{
			drop_oldest();
		}

		Node* node = new Node(key, value);
		elems_[key] = node;
		attach(node);
		return 0;
	}

	void dump()
	{
		std::cout << "dump-----------------------" << endl;
		Node* node = head_->next;
		while (node && node != head_) {
			std::cout << "------------\t" << node->key << "\t" << node->value << endl;
			node = node->next;
		}
	}
protected:
	void detatch(Node* node)
	{
		node->prev->next = node->next;
		node->next->prev = node->prev;
	}

	void attach(Node* node)
	{
		node->next = head_->next;
		node->prev = head_;
		head_->next->prev = node;
		head_->next = node;
	}

	void drop_oldest()
	{
		Node* node = head_->prev;// last node
		assert(node != head_);// not empty
		if (node == head_) {
			return;// empty
		}
		K key = node->key;
		elems_.erase(key);
		head_->prev = node->prev;
		node->prev->next = head_;
		delete node;
	}
protected:
	boost::unordered_map<K, Node*> elems_;
	Node* head_;
	std::size_t size_;
//	Mutex lock;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值