我需要根据插入时间(或其他更有效的方式)从std :: map中删除元素。
该映射表可能会保存数千个元素,如果我存储时间并迭代地图以检查每个元素的时间,那么它可能最终变得非常耗时。
有没有人有好主意如何在std :: map中清除旧元素?
我需要根据插入时间(或其他更有效的方式)从std :: map中删除元素。
该映射表可能会保存数千个元素,如果我存储时间并迭代地图以检查每个元素的时间,那么它可能最终变得非常耗时。
有没有人有好主意如何在std :: map中清除旧元素?
std::map<>
类型没有插入元素时的概念,它只用于保存键值对映射。它也没有插入顺序的概念,因此甚至无法提供相对类型的插入。std::queue
。每次将元素插入映射中时,也将其插入std::queue
中。队列前面的元素比后面的元素旧,您可以使用这个特性来确定它们的相对年龄。与LRU Cache相似。
Boost.MultiIndex库展示了MRU Cache(最近最常用),因此将其适应为LRU应该很容易。
基本上,想法是并行维护两个数据结构:
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();
}
}
> EXPIRY
吗? - klaus