想象一下,你有一个非常大的double数组和一个简单的函数avg(double*,size_t)
来计算平均值(只是一个简单的例子:数组和函数都可以是任何数据结构和算法)。我想如果第二次调用该函数并且同时没有更改数组,则返回值直接来自前一个,而不经过未更改的数据。
保持前一个值看起来很简单,我只需要一个函数内部的静态变量,对吧?但是如何检测阵列中的变化呢?我是否需要编写一个接口来访问数组,该数组设置一个标志以供函数读取?可以做一些更聪明,更便携的东西吗?
答案 0 :(得分:0)
#include <limits>
#include <map>
// Note: You have to manage cached results - release it with avg(p, 0)!
double avg(double* p, std::size_t n) {
typedef std::map<double*, double> map;
static map results;
map::iterator pos = results.find(p);
if(n) {
// Calculate or get a cached value
if(pos == results.end()) {
pos = results.insert(map::value_type(p, 0.5)).first; // calculate it
}
return pos->second;
}
// Erase a cached value
results.erase(pos);
return std::numeric_limits<double>::quiet_NaN();
}