2

100単位ベクトルの10単位ごとに平均化する関数を書いています。10回の反復ごとに一時的な合計をクリアする必要があります。通常は書きますave=0.0が、aveがdoubleではなく、あるタイプの場合T、問題が発生します。たとえば、xyz座標を使用してポイントを平均すると、実行できません。{x,y,z} = 0.0

回避するために、スマートポインターを作成してからリセットしようとしました。それは私にセグメンテーション違反を与えました。指定されたタイプを持たないオブジェクトをクリアするための最良の方法は何ですか?

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;
}

に置き換えるave.reset()ave = 0.0、コードは機能します。

4

2 に答える 2

5

初期化するには:

T ave = T();

そしてそれをリセットするには:

ave = T();
于 2012-05-13T20:14:49.027 に答える
2

aveが の場合shared_ptr<T>、これを試しaveてデフォルトで初期化された にリセットしますT

*ave = T();
于 2012-05-13T20:13:48.920 に答える