2012-05-13 54 views
2

我正在寫一個平均每100個單位矢量的10個單位的函數。每10次迭代後我必須清除一個臨時總和。 通常情況下,我會寫ave=0.0,但如果ave不是雙倍但是某種類型T,我遇到了問題。例如,如果我平均與xyz座標點,s我不能做{x,y,z} = 0.0如何清除泛型C++代碼中的`double`?

要解決,我試圖創建一個智能指針,然後重置它。那給了我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; 
} 

,如果我取代ave.reset()ave = 0.0,代碼工作。

+0

「平均」函數的意圖是什麼?它沒有計算出平均值,但做了一些不同的事情。 –

+0

@DavidRodríguez-dribeas它需要一個大小爲'v.size()'的向量,平均每個'n'個元素,並輸出一個大小爲'v.size()/ n'的向量。我這樣做是爲了減少gnuplot的加載時間。當我不得不繪製尺寸爲10_000_000的矢量時,我運行此函數並獲得尺寸爲1000的矢量。1000具有幾乎相同的值,但是我需要它們,因爲我想從我的辛集成器中獲得高精度 –

回答

5

將其初始化:

T ave = T(); 

,並重置密碼:

ave = T(); 
+0

使用智能指針?如果'T'是一個大對象,使用智能指針在內存上會更好,對吧? –

+0

@kirill_igum:我沒有說使用智能指針有什麼問題。你說你把它變成了一個智能指針,作爲解決嘗試重置值的問題的解決方法。該解決方法是不必要的,所以我沒有將其包含在我的解決方案中。 –

+1

@kirill_igum:針對你的第二個問題,你的意思是「內存更好」是什麼意思?佔用更少的空間?沒有。在堆棧上佔用較少的空間?也許吧,但是如果你使用的對象太大,以至於在堆棧上創建一個對象是一個問題,那麼你使用的是錯誤的類,你應該停止使用它。如果你真的想讓它成爲一個聰明的指針,那麼沒有理由將其設爲shared_ptr,因爲沒有共享。 –

2

如果aveshared_ptr<T>,試試這個重置ave爲缺省初始化T

*ave = T();