LRU算法--作为缓存

  1. LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。
  2. 实现思想:用list保存数据,用unodered_map保存指向list的指针(方便定位查找),和一个数据量的最大值
  3. 代码如下:
    #include<iostream>
    #include<functional>
    #include<list>
    #include<unordered_map>
    
    using namespace std;
    /*
     * File:   lrucache.hpp
     * Author: Alexander Ponomarev
     *
     * Created on June 20, 2013, 5:09 PM
     */
    template<typename key_t, typename value_t>
    class lru_cache {
    public:
    	typedef typename std::pair<key_t, value_t> key_value_pair_t;
    	typedef typename std::list<key_value_pair_t>::iterator list_iterator_t;
    
    	lru_cache(size_t max_size) :
    		_max_size(max_size) {
    	}
    
    	void put(const key_t& key, const value_t& value) {
    		auto it = _cache_items_map.find(key);
    		_cache_items_list.push_front(key_value_pair_t(key, value));
    		if (it != _cache_items_map.end()) {
    			_cache_items_list.erase(it->second);
    			_cache_items_map.erase(it);
    		}
    		_cache_items_map[key] = _cache_items_list.begin();
    
    		if (_cache_items_map.size() > _max_size) {
    			auto last = _cache_items_list.end();
    			last--;
    			_cache_items_map.erase(last->first);
    			_cache_items_list.pop_back();
    		}
    	}
    
    	const value_t& get(const key_t& key) {
    		auto it = _cache_items_map.find(key);
    		if (it == _cache_items_map.end()) {
    			throw std::range_error("There is no such key in cache");
    		}
    		else {
    			_cache_items_list.splice(_cache_items_list.begin(), _cache_items_list, it->second);
    			return it->second->second;
    		}
    	}
    
    	bool exists(const key_t& key) const {
    		return _cache_items_map.find(key) != _cache_items_map.end();
    	}
    
    	size_t size() const {
    		return _cache_items_map.size();
    	}
    	void print()
    	{
    		for (const key_value_pair_t& i : _cache_items_list)
    		{
    			cout << i.first << "---" << i.second << '\t';
    		}
    		cout << endl;
    	}
    
    private:
    	std::list<key_value_pair_t> _cache_items_list;
    	std::unordered_map<key_t, list_iterator_t> _cache_items_map;
    	size_t _max_size;
    };
    
    int main()
    {
    	lru_cache<int, int> n_cache(5);
    	n_cache.put(1, 1);
    	n_cache.put(2, 2);
    	n_cache.put(3, 3);
    	n_cache.put(4, 4);
    	n_cache.put(5, 5);
    	n_cache.print();
    	n_cache.put(4, 4);
    	n_cache.print();
    	n_cache.put(2, 2);
    	n_cache.print();
    	
    	return 0;
    }
  4. 运行结果如下:
  5. 其它的缓存算法(页面置换算法)--FIFO/LFU
发布了51 篇原创文章 · 获赞 2 · 访问量 860

猜你喜欢

转载自blog.csdn.net/YRC333/article/details/99086568