根据插入时间从std :: map中删除元素

the*_*lse 10 c++ stdmap std map

我需要根据插入时间(或其他更高效的东西)从std :: map中删除元素.

地图可能包含数千个元素,如果我存储时间并迭代地图以检查每个元素的时间,它可能最终会非常耗时.

有没有人知道如何在std :: map老化时擦除它们?

Jar*_*Par 7

std::map<>类型没有插入元素的概念.它仅用于保存键/值对映射.它也没有插入顺序的概念,所以它甚至不能提供相对类型的插入.

要做你想做的事,你需要在元素和插入时间之间添加关联.如果你想要的只是相对顺序,那么你可以使用std::queue与地图配对.每次插入地图时,都会插入到地图中std::queue.队列前面的元素比后面的元素更长,您可以将它用于相对年龄


Mat*_* M. 6

非常接近LRU Cache

Boost.MultiIndex的库显示的例子MRU高速缓存(最近使用),所以它适应LRU应该是微不足道的。

基本上这个想法是并行维护两个数据结构:

  • amap中的项目
  • adeque包含对地图的引用

基本代码:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果要获得多线程代码,这些结构需要同步。