当前位置: 首页 > news >正文

最近最少使用数据结构(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;
};


http://www.mrgr.cn/news/7107.html

相关文章:

  • 智算中心网络交换机缓存架构解析
  • flume系列之:flume生产环境sink重要参数理解
  • 广州自闭症学校哪家好?
  • 【大模型理论篇】基于3D可视化视角理解GPT
  • STM32————SPI硬件外设实现读写
  • Spring Boot-加载配置文件ConfigDataEnvironmentPostProcessor
  • 25届网安秋招,信息泄露常问之配置信息泄露
  • 外网爆火的LLM应用手册来了!内行人都在学的大模型黑书,豆瓣评分高达9.9!!!
  • 【Python机器学习】NLP概述——自然语言智商
  • 【OpenFeign】OpenFeign指定url方式调用
  • K8S 基于本地存储的一主一从 MySQL 架构
  • 程序员的恐惧之源-改需求
  • Flat Ads:全球金融应用的营销投放洞察
  • 金融帝国实验室(Capitalism Lab)官方技术支持中文汉化包_v4.09
  • 一文彻底搞懂CNN - 模型架构(Model Architecture)
  • Springsecurity 自定义AuthenticationManager
  • web测试之功能测试常用的方法有哪几种?有什么要点要注意?
  • 【JavaEE】深入MyBatis:动态SQL操作与实战项目实现指南
  • 前端打字效果
  • RKNN在转换过程中的均值和方差设置问题