根据插入时间从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 中删除元素的最佳方法

从 unordered_map 内的向量中删除元素

如何在删除元素时防止重新散列 std::unordered_map?

在不使用 if 的情况下插入/更新 std::unordered_map 元素的最快方法是啥?

从满足谓词的无序映射中删除元素

Qt 5.14.2 在向 std::map 插入元素时出现语义问题