C ++如何将地图与循环缓冲区混合?

时间:2011-08-22 20:58:46

标签: c++ dictionary boost circular-buffer

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

3 个答案:

答案 0 :(得分:3)

根据您的需要,您想要的是LRU(最近最少使用的)地图或LRA(最近添加的最少)地图。

实施已经存在。

答案 1 :(得分:1)

那不是真正的“循环缓冲区”,因为这对地图没有多大意义,但是我们可以使用一个简单的数组而不需要任何其他链接列表或任何东西。

这称为closed hashing - 维基文章很好地总结了它。双散列是最常用的,因为它避免了聚类(导致性能更差),但有自己的问题(局部性)。

编辑:由于你想要一个特定的实现,我不认为boost有一个,但在另一个关于封闭散列的SO帖子中提到了thisthis

答案 2 :(得分:1)

好吧,我不认为这种结构在boost中是开箱即用的(虽然可能存在于其他地方),所以你应该创建它。我不建议使用operator[](),至少在std::map中实施,因为这可能难以跟踪添加到地图中的元素(对于exacmle,使用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();
       }
     }
};