根据插入时间从std :: map中删除元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据插入时间从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();
}
}
当然,如果想要获得多线程代码,那些结构需要同步。
另一答案
您可以使用队列,并在将对象插入地图时插入指向对象的指针。队列中的下一个项目将是最旧的项目。或者,如果您还需要插入时间,则可以将一对存储在队列中。
以上是关于根据插入时间从std :: map中删除元素的主要内容,如果未能解决你的问题,请参考以下文章
从嵌套在 std::map 中的 std::list 中删除元素的最佳方法
如何在删除元素时防止重新散列 std::unordered_map?