Довольно близко к LRU Cache .
В библиотеке Boost.MultiIndex показан пример MRU Cache (чаще всего используется),поэтому адаптация его к LRU должна быть тривиальной.
По сути, идея состоит в том, чтобы поддерживать две структуры данных параллельно:
- a
map
с элементами в deque
со ссылками на карту
Базовый код:
static double const EXPIRY = 3600; // seconds
std::map<Key, Value> map;
std::deque<std::pair<std::map<Key, Value>::iterator, time_t>> deque;
bool insert(Key const& k, Value const& v) {
std::pair<std::map<Key, Value>::iterator, bool> result =
map.insert(std::make_pair(k, v));
if (result.second) {
deque.push_back(std::make_pair(result.first, time()));
}
return result.second;
}
// to be launched periodically
void clean() {
while (not deque.empty() and difftime(time(), deque.front().second) > EXPIRY) {
map.erase(deque.front().first);
deque.pop_front();
}
}
Конечно, эти структуры должны быть синхронизированы, если необходимо получить многопоточный код.