Całkiem blisko LRU Cache.
Biblioteka Boost.MultiIndex pokazuje przykład MRU Cache (najczęściej używany), więc dostosowanie go do LRU powinno być trywialne.
Zasadniczo chodzi o to, aby utrzymać dwie struktury danych równolegle:
map
z rzeczami w
deque
z odniesieniami do mapy
kod podstawowy:
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();
}
}
Oczywiście te struktury wymagają e zsynchronizowane, jeśli celem jest uzyskanie kodu wielowątkowego.
możesz chcieć rzucić okiem na kontenery boost multi index – PlasmaHH
Old? Musisz mieć określone kryteria, aby wykonać akcję, chyba że ją zdefiniujesz, Q jest prawie bezkierunkowe. –
@PlasmaHH tak podbicie nie byłoby możliwe do wykorzystania w tym projekcie – theAlse