I need to erase elements from an std::map based on the time of insertion (or something else more efficient than that).
The map will probably hold thousands of elements a
Pretty close to LRU Cache.
The Boost.MultiIndex library shows an example of MRU Cache (Most Recently Used), so adapting it to LRU should be trivial.
Basically the idea is to maintain two data structures in parallel:
map
with the items indeque
with references into the mapBasic code:
static double const EXPIRY = 3600; // seconds
std::map map;
std::deque::iterator, time_t>> deque;
bool insert(Key const& k, Value const& v) {
std::pair::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();
}
}
Of course, those structures need be synchronized if the intent is to get multi-threaded code.