将内存中的树结构表示为缓存的最佳方法是什么?

时间:2010-10-23 14:34:06

标签: c++ qt data-structures caching treeview

大家好 我有树节点。节点由TCP API请求响应值构成。 为了减少请求,我想在缓存结构中表示树,每次都要调用TCP请求 它会先检查缓存。 最好的方法是什么?我的意思是树缓存部分,在我的例子中我使用的是Qt和C ++。

2 个答案:

答案 0 :(得分:1)

您可以使用std:map<TCPRequest, TCPResponse>来实现此目的。您的请求和响应可能是字符串,在这种情况下,可能会减少到std:map<std::string, std::string>。如果没有,您需要确保TCPRequest类支持operator<以允许对地图进行二进制搜索。

您的代码可能类似于

#include <map>

std::map<TCPRequest, TCPResponse> responseCache;
typedef std::map<TCPRequest, TCPResponse>::const_iterator cacheCIterator;

TCPRequest nextRequest;
cacheCIterator iter = responseCache.find(nextRequest);
if (iter != responseCache.end())
{
  return iter->second;  // found cached response
}
else
{
  // issue the request
  TCPResponse response = issueRequest(nextRequest);

  //save the response
  responseCache[nextRequest] = response;
  return response;
}  

您还需要考虑缓存过期,除非您的流量足够小,您只能缓存所有响应。在某些时候,您希望从地图中erase() TCPResponse个对象,可能通过保留一个单独的结构来告诉您哪个响应最近最少使用(LRU)。

考虑到这一点,可以在int对象中使用某种唯一标识符(单调增加的TCPResponse可用作完整对象的代理,允许您识别缓存使用int s而不是完整的类实例进行LRU响应。您仍需要进行完整的TCPRequest比较,以确保缓存按预期工作。

答案 1 :(得分:0)

如果未完成的请求数量很大,您可能需要考虑哈希映射。请参阅QT库中的QHash或std :: hash_map(取决于您使用的STL的风格)。