通常,存储计算量很大的值的最佳做法是什么。我最初只计算了双打并用地图来存储它们
class Calc
{
map<string, double> m_cache;
virtual bool isCached(const string& key )
{ return m_cache.find(key) != m_cache_.end(); }
double getHeavyA() {
string key = "a";
if ( !isCached( key ) ) { m_cache[key] = getHeavyA(); }
return m_cache[key];
}
double getHeavyB() {
string key = "b";
if ( !isCached( key ) ) { m_cache[key] = getHeavyB(); }
return m_cache[key];
}
void clearCache() { m_cache.clear(); }
本身可能不是最优雅,最有效的方式。但是现在我还有函数返回不同的obj / data类型,我宁愿避免使用各种数据类型的映射。有没有首选的方法呢?我只能提出一个包含不同值的结构。这是一个好方法还是有更好的方法?
答案 0 :(得分:2)
如果您不需要,请不要使用map
!
template<typename T>
struct Cached {
T value_;
bool valid_= false;
void Update(T x) { value_ = x; valid_ = true;}
void Uncache() { valid_ = false;}
};
class Calc {
Cached<double> a_;
double getA() {
// don't be tempted to merge this into a call. You don't want to
// call getHeavyA() unnecessarily.
if ( !a.Valid_ ) { a_.Update( getHeavyA()); }
return a_.value_;
}
Cached<int64_t> b_;
int64_t getB() {
if ( !b.Valid_ ) { b_.Update( getHeavyB()); }
return b_.value_;
}
...
void clearCache() { a_.Uncache(); b_.Uncache(); }