c++中如何混合映射和循环缓冲区
C++ how to mix a map with a circular buffer?
我想知道是否有可能有一个像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帖子中提到过。
相关文章:
- 在映射擦除c++期间执行循环的次数
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 映射中循环的迭代器
- 为什么这个 x 值在这个循环映射中没有增加?C++
- 在循环(C++)中用新指针填充映射
- c++ 在循环中删除迭代器(映射的映射)
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 映射基于自动的循环单元素访问C++
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- 在 stl 映射和列表 (c++) 上进行迭代的泛型循环
- C++:分段函数,循环初始化为映射
- c++ 过期映射条目线程与事件循环
- 我如何将输入分配给在 for 循环中设置的映射功能
- 循环访问提升mapped_region/内存映射文件
- 复制地图<双精度,元组<双精度,双精度>>映射<双精度,双精度>没有循环?
- 在使用无序多映射实现的有向图中查找循环
- 循环访问映射并删除动态分配的元素
- 不带迭代程序的哈希映射循环
- 如何在映射向量中循环访问地图