2012-05-13 4 views
2

私は100単位ベクトルの10単位ごとに平均をとる関数を書いています。 10回の繰り返しごとに一時的な合計をクリアする必要があります。 通常、私はave=0.0と書いていますが、aveがダブルではなく、ある種のタイプTであれば問題に遭遇します。たとえば、xyz座標のポイントを平均した場合、私はできません{x,y,z} = 0.0ジェネリックC++コードで `double`をクリアする方法は?

回避するには、私はスマートポインタを作成し、それをリセットしようとしました。それは私にseg faultを与えました。 指定された型のオブジェクトを消去する最も良い方法は何ですか?私はave = 0.0ave.reset()を交換する場合

template <class T> 
vector<T> average(const vector<T> &v, const int n) { 
    vector<T> ave_vec; 
    int iave = 0; 
    shared_ptr<T> ave(new T); 
    for (int i = 0; i < v.size(); i++) { 
    *ave += v[i]; 
    iave++; 
    if (iave == n) { 
     ave_vec.push_back(*ave/n); 
     ave.reset(); ///> gives seg fault 
     iave=0; 
    } 
    } 
    return ave_vec; 
} 

、コードが動作します。

+0

'average'関数の目的は何ですか?それは平均を計算しませんが、何か違うことをします。 –

+0

@DavidRodríguez-dribeasそれはサイズ 'v.size()'のベクトルをとり、 'n '個の要素ごとに平均し、サイズ' v.size()/ n'のベクトルを出力します。私はgnuplotの読み込み時間を短縮するためにこれを行います。私はサイズ10_000_000のベクトルをプロットする必要があるとき、私はこの関数を実行し、1000のベクトルを取得します。1000はほぼ同じ値を持っていますが、私はsymplectic ode積分器から高精度を望んでいたのでそれらが必要です –

答えて

5

を:

T ave = T(); 

し、それをリセットする:

ave = T(); 
+0

スマートポインタ? 'T 'が大きなオブジェクトである場合、スマートポインタを使うとメモリ上でよりうまくいくでしょうか? –

+0

@kirill_igum:私はスマートなポインタを使って何か問題があったとは言いませんでした。あなたは、値をリセットしようとする問題の回避策として、それをスマートなポインターにしたと言いました。その回避策は不要だったので、私はそれを私のソリューションに含めませんでした。 –

+1

@kirill_igum:あなたの2番目の質問に答えると、「記憶力の向上」とはどういう意味ですか?スペースをとらない?いいえ、スタックのスペースを少なくしますか?たぶん、スタック上に作成するのに問題があるほど大きいオブジェクトを使用している場合は、障害のあるクラスを使用しているので、使用をやめてください。あなたが本当にそれをスマートなポインタにしたければ、shared_ptrになる理由はありません。なぜなら、共有は行われていないからです。 –

2

aveshared_ptr<T>ある場合は、デフォルトの初期化Taveをリセットするには、この試してみてください。それを初期化するには

*ave = T(); 
関連する問題