C++ 如何清除泛型c+中的'double'+;密码?

C++ 如何清除泛型c+中的'double'+;密码?,c++,generics,smart-pointers,generic-programming,C++,Generics,Smart Pointers,Generic Programming,我在写一个函数,它平均每10个单位的100个单位的向量。我必须在每10次迭代后清除一个临时总数。 通常,我会写ave=0.0,但如果ave不是双精度而是某种类型的T,我就会遇到问题。例如,如果我用xyz坐标对点进行平均,s我不能做{x,y,z}=0.0 为了解决这个问题,我尝试创建一个智能指针,然后重置它。这给了我seg故障。 清除没有指定类型的对象的最佳方法是什么 template <class T> vector<T> average(const vector<

我在写一个函数,它平均每10个单位的100个单位的向量。我必须在每10次迭代后清除一个临时总数。 通常,我会写
ave=0.0
,但如果
ave
不是双精度而是某种类型的
T
,我就会遇到问题。例如,如果我用xyz坐标对点进行平均,s我不能做
{x,y,z}=0.0

为了解决这个问题,我尝试创建一个智能指针,然后重置它。这给了我seg故障。 清除没有指定类型的对象的最佳方法是什么

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;
}
模板
向量平均值(常数向量&v,常数整数n){
向量ave_vec;
int-iave=0;
共享道路(新T);
对于(int i=0;i给出seg故障
iave=0;
}
}
返回ave_vec;
}

如果我将
ave.reset()
替换为
ave=0.0
,则代码可以工作。

如果
ave
共享的\u ptr
,请尝试将
ave
重置为默认初始化的
T

*ave = T();
要初始化它,请执行以下操作:

T ave = T();
要重置它,请执行以下操作:

ave = T();

average
函数的目的是什么?它不计算平均值,但做了一些不同的事情。@DavidRodríguez dribeas它取一个大小为
v.size()
的向量,平均每个
n
元素,并输出一个大小为
v.size()/n
的向量。我这样做是为了减少gnuplot的加载时间。当我必须绘制一个大小为10_000_000的向量时,我运行这个函数,得到一个大小为1000的向量。1000具有几乎相同的值,但我需要它们,因为我希望辛码积分器具有高精度使用智能指针有什么问题?如果
T
是一个大对象,那么使用智能指针在内存方面会更好,对吗?@kirill\u igum:我没说使用智能指针有什么问题。你说你把它做成了一个智能指针,用来解决重置值的问题。这个变通方法是不必要的,所以我没有把它包括在我的解决方案中。@kirill_igum:关于你的第二个问题,你说的“更好的记忆力”是什么意思?占用更少的空间?不,在堆栈上占用更少的空间?也许吧,但是如果您使用的对象太大,以至于在堆栈上创建一个对象是一个问题,那么您使用的是一个错误的类,您应该停止使用它。如果您真的想让它成为一个智能指针,那么就没有理由共享它,因为没有共享。