[英]C++ how to mix a map with a circular buffer?
我想知道是否有可能像增强循环缓冲区一样工作的地图。 意味着它的大小有限,当它达到有限的大小时,它将开始覆盖第一个插入的元素。 此外,我希望能够通过这样的缓冲区搜索并使用[name]
find or create
。 有可能创造这样的东西,怎么做?
您想要的是LRU(最近最少使用)地图,或LRA(最近添加的最少)地图,具体取决于您的需求。
实施已经存在。
好吧,我不认为这种结构在boost中是开箱即用的(尽管可能存在于其他地方),所以你应该创建它。 我不建议使用operator[]()
,至少因为它在std::map
,因为这可能使得难以跟踪添加到地图中的元素(对于exapmle,使用operator[]()
和value将空值添加到地图中),并进行更明确的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();
}
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.