不更改数据时避免重新计算

时间:2013-09-11 15:17:35

标签: c++ arrays dynamic

想象一下,你有一个非常大的double数组和一个简单的函数avg(double*,size_t)来计算平均值(只是一个简单的例子:数组和函数都可以是任何数据结构和算法)。我想如果第二次调用该函数并且同时没有更改数组,则返回值直接来自前一个,而不经过未更改的数据。

保持前一个值看起来很简单,我只需要一个函数内部的静态变量,对吧?但是如何检测阵列中的变化呢?我是否需要编写一个接口来访问数组,该数组设置一个标志以供函数读取?可以做一些更聪明,更便携的东西吗?

1 个答案:

答案 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();
}