2

double の非常に大きな配列とavg(double*,size_t)、平均値を計算する単純な関数があると想像してください (単純な例: 配列と関数の両方が、データ構造とアルゴリズムのいずれであってもかまいません)。関数が2回呼び出され、その間に配列が変更されていない場合、戻り値は変更されていないデータを経由せずに、前の値から直接取得されることを望みます。

前の値を保持するのは簡単に見えますが、関数内に静的変数が必要なだけですよね? しかし、配列の変更を検出するのはどうでしょうか? 関数によって読み取られるフラグを設定する配列にアクセスするためのインターフェイスを作成する必要がありますか? よりスマートでポータブルな何かを行うことはできますか?

4

2 に答える 2

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();
}
于 2013-09-11T18:12:32.043 に答える