gpt4 book ai didi

C++ 真正简单的 LRU 缓存的最佳容器

转载 作者:太空狗 更新时间:2023-10-29 21:50:12 29 4
gpt4 key购买 nike

我需要实现一个非常简单的 LRU 缓存来存储内存地址。

  • 这些地址的数量是固定的(在运行时)。
  • 我只对最近使用的地址感兴趣(我不关心其他元素的顺序)。
  • 每个地址都有一个对应的索引号(简单整数),该索引号不是唯一的并且可以更改。

实现需要以尽可能少的开销运行。除了每个地址之外,还有一个相关的信息结构(包含索引)。

我目前的方法是使用 std::list 来存储地址/信息对和 boost::unordered_multimap 这是索引和相关对象之间的映射列表的迭代器。

以下示例与我的生产代码无关。请注意,这只是为了更好地理解。

struct address_info
{
address_info() : i(-1) {}
int i;
// more ...
};


int main()
{
int const MAX_ADDR_COUNT = 10,
MAX_ADDR_SIZE = 64;

char** s = new char*[MAX_ADDR_COUNT];
address_info* info = new address_info[MAX_ADDR_COUNT]();

for (int i = 0; i < MAX_ADDR_COUNT; ++i)
s[i] = new char[MAX_ADDR_SIZE]();

typedef boost::unordered_multimap<int, std::list<std::pair<address_info, char*>>::const_iterator> index_address_map;

std::list<std::pair<address_info, char*>> list(MAX_ADDR_COUNT);
index_address_map map;

{
int i = 0;
for (std::list<std::pair<address_info, char*>>::iterator iter = list.begin(); i != MAX_ADDR_COUNT; ++i, ++iter)
*iter = std::make_pair(info[i], s[i]);
}

// usage example:
// try to find address_info 4
index_address_map::const_iterator iter = map.find(4);
if (iter == map.end())
{
std::pair<address_info, char*>& lru = list.back();

if (lru.first.i != -1)
map.erase(lru.first.i);
lru.first.i = 4;

list.splice(list.begin(), list, boost::prior(list.end()));
map.insert(std::make_pair(4, list.begin()));
}
else
list.splice(list.begin(), list, iter->second);

for (int i = 0; i < MAX_ADDR_COUNT; ++i)
delete[] s[i];

delete[] info;
delete[] s;

return 0;
}

最佳答案

通常的建议是为任务挖掘 Boost.MultiIndex:

  • 索引0:插入顺序
  • 索引 1:元素的键(二进制搜索或哈希)

如果我没记错的话,它甚至在 Boost 站点上进行了演示。

关于C++ 真正简单的 LRU 缓存的最佳容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6570596/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com