您的位置:首页 > 房产 > 建筑 > 最近最少使用数据结构(LRU)

最近最少使用数据结构(LRU)

2025/1/24 2:22:18 来源:https://blog.csdn.net/yuanshenqiang/article/details/141476580  浏览:    关键词:最近最少使用数据结构(LRU)

抛开算法刷题的角度,LRU数据结构可根据访问时间远近自动排序,在有些场景下还是很有用的,如统计用户活跃度,API调用热力图分析,缓存块管理等。下面基于c++模板提供一个通用的LRU类,以供参考。

#include <functional>
#include <list>
#include <unordered_map>
#include <utility>template<typename Key, typename Val>
class LRUCache {
public:using value_deinit_callback = std::function<void(Key, Val)>;static void value_release_handle(Key k, Val v){}//如果Val是指针类型,可在func中指定指针清理动作LRUCache(int capacity, const value_deinit_callback& func = value_release_handle) :m_capacity(capacity), m_value_deinit(func){}~LRUCache(){for (auto pairs : m_cached_list){if (m_value_deinit.operator bool())m_value_deinit(pairs.first, pairs.second);}m_hash_table.clear();m_cached_list.clear();}Val get(const Key& key) {auto iter = m_hash_table.find(key);if (iter == m_hash_table.end())return Val{};auto& liter = iter->second;auto pairs = *liter;m_cached_list.erase(liter);liter = m_cached_list.insert(m_cached_list.end(), pairs);return liter->second;}void put(Key key, Val val) {auto iter = m_hash_table.find(key);if (iter != m_hash_table.end()){auto pairs = *iter->second;pairs.second = val;m_cached_list.erase(iter->second);iter->second = m_cached_list.insert(m_cached_list.end(),pairs);}else{if (m_cached_list.size() >= m_capacity){auto& pairs = m_cached_list.front();auto& fkey = pairs.first;auto& fval = pairs.second;auto it = m_hash_table.find(fkey);if (it != m_hash_table.end()){m_value_deinit(fkey, fval);m_hash_table.erase(it);}m_cached_list.pop_front();}m_hash_table.insert(std::make_pair(key, m_cached_list.insert(m_cached_list.end(), std::make_pair(key, val))));}}
private:int m_capacity;value_deinit_callback m_value_deinit;std::unordered_map<Key, typename std::list<std::pair<Key, Val>>::iterator> m_hash_table;std::list<std::pair<Key, Val>> m_cached_list;
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com