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

时间:2012-03-15 14:45:07

标签: c++ map std stdmap

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

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

有人知道如何在std :: map老化时擦除元素吗?

3 个答案:

答案 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)

您可以使用队列,并在对象插入地图时插入指针。队列中的下一个项目将是最旧的项目。或者,如果您还需要插入时间,则可以在队列中存储一对。