我需要根据插入时间(或其他更有效的东西)从std :: map中删除元素。
地图可能会包含数千个元素,如果我存储时间并迭代地图以检查每个元素的时间,它可能最终耗费时间。
有人知道如何在std :: map老化时擦除元素吗?
答案 0 :(得分:6)
std::map<>
类型没有插入元素的概念。它仅用于保存键/值对映射。它也没有插入顺序的概念,所以它甚至不能提供相对类型的插入。
要执行您想要的操作,您需要在元素和插入时间之间添加关联。如果你想要的只是相对顺序,那么你可以使用与地图配对的std::queue
。每次插入地图时,您也会插入std::queue
。队列前面的元素比后面的元素更长,您可以将其用于相对年龄
答案 1 :(得分:4)
非常接近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();
}
}
当然,如果想要获得多线程代码,那么这些结构需要同步。
答案 2 :(得分:1)
您可以使用队列,并在对象插入地图时插入指针。队列中的下一个项目将是最旧的项目。或者,如果您还需要插入时间,则可以在队列中存储一对。