c++中如何混合映射和循环缓冲区

C++ how to mix a map with a circular buffer?

本文关键字:映射 循环 循环缓冲 缓冲区 混合 何混合 c++      更新时间:2023-10-16

我想知道是否有可能有一个像boost循环缓冲一样工作的地图。这意味着它的大小是有限的,当它达到有限的大小时,它将开始覆盖第一个插入的元素。我还希望能够搜索通过这样的缓冲和find or create[name]。有可能创造这样的东西吗?怎么做?

您需要的是LRU(最近最少使用)地图,或LRA(最近最少添加)地图,这取决于您的需要。

实现已经存在。

嗯,我不认为这种结构在boost中是现成的(但可能存在于其他地方),所以您应该创建它。但是,我不建议使用operator[](),至少在std::map中是这样实现的,因为这可能会使跟踪添加到映射中的元素变得困难(例如,使用带值的operator[]()将空值添加到映射中),并使用更显式的get和put操作来添加和检索映射的元素。

对于最简单的实现,我会使用实际的map作为存储,并使用deque用于存储添加的元素(未测试):

template <typename K, typename V>
struct BoundedSpaceMap
{
    typedef std::map<K,V> map_t;
    typedef std::deque<K> deque_t;
    // ...
    typedef value_type map_t::value_type;
    // Reuse map's iterators
    typedef iterator map_t::iterator;
    // ...
    iterator begin() { return map_.begin(); }
    // put
    void put ( K k, V v)
    { map_.insert(std::make_pair(k,v));
      deque_.push_back(k);
      _ensure();  // ensure the size of the map, and remove the last element
    }
     // ...
private:
     map_t map_;
     deque_t deque_;
     void _ensure() { 
       if (deque_size() > LIMIT) { 
         map_.erase(deque_.front()); deque_.pop_front();
       }
     }
};

并不是一个真正的"循环缓冲区",因为这对map来说没有多大意义,但我们可以使用一个简单的数组,而不需要任何额外的链表或其他东西。

这被称为封闭散列——wiki文章很好地总结了它。双哈希是最常用的,因为它避免了集群(这会导致更差的性能),但也有自己的问题(局部性)。

编辑:因为你想要一个特定的实现,我不认为boost有一个,但这个或这个在另一个关于封闭哈希的SO帖子中提到过。