2011-08-05 28 views
3

我對C++模板比較陌生,並且正在實現一些數值例程。特別是,我一直在尋找一些代碼,其風格是這樣的,如果它是定義一個向量,這將是作爲模板與構造參數的數值參數集

template <class Field> 
class Vector2 
{ 
    private: 
    std::vector<Field> container; 

    public: 
    Vector2(size_t size) : container(std::vector<Field>(size, Field(0))) {} 
    Vector2(const Vector2<Field> &source) : container(source.container) {} 

      Field & operator[](size_t index) { return container.at(index); } 
    const Field & operator[](size_t index) const { return container.at(index); } 

    Vector2<Field> operator+(const Vector2<Field> & rhs) const { 
     if (rhs.container.size() != container.size()) 
      throw new std::invalid_argument("wrong size"); 

     Vector2<Field> sum(*this); 
     for (int i = 0; i < container.size(); i++) 
      sum[i] += rhs[i]; 
     return sum; 
    } 
}; 

但是,如果我在設計類模板,我會選擇到指定尺寸模板參數:

template <int size, class Field> 
class Vector1 
{ 
    private: 
    std::vector<Field> container; 

    public: 
    Vector1() : container(std::vector<Field>(size, Field(0))) {} 
    Vector1(const Vector1<size, Field> &source) : container(source.container) {} 

    Field & operator[](size_t index) { return container.at(index); } 
    const Field & operator[](size_t index) const { return container.at(index); } 

    Vector1<size, Field> operator+(const Vector1<size, Field> & rhs) const { 
     Vector1<size, Field> sum; 
     for (int i = 0; i < size; i++) 
      sum[i] += rhs[i]; 
     return sum; 
    } 
}; 

我的想法是,這將防止事情,如添加不同尺寸的兩個向量,因爲它們將是不同的類。特別是,像

Vector1<double> a (3); 
Vector1<double> b (4); 
Vector1<double> c = a + b; 

需要運行時的大小的檢查,但

Vector2<3,double> a; 
Vector2<4,double> b; 
Vector2<5,double> c = a + b; 

甚至不會編譯。由於該代碼是數值分析軟件包的一部分,因此執行速度至關重要,我必須假設作者會考慮這樣的事情。這種風格在整個代碼中用於向量,矩陣和其他要被解釋爲數值參數化集合(即不同維度的向量空間)元素的對象。

所以,我的問題是,

是否有任何的執行速度考慮,將意味着構造函數參數方法與模板參數方法的偏愛?

+0

這門課有什麼意義? –

+0

@Seth;重點是要有用於數值線性代數的對象。 – JRG

+0

我剛剛重讀了這個問題,並且看到了_as if_。之前,我想知道'Vector2'類的重點是什麼,但現在我發現這只是一個例子。 –

回答

3

當然。如果矢量大小是運行時參數,那麼二進制操作必須在運行時檢查操作數大小是否一致。

理想情況下,C++數值包應該爲模板提供運行時指定的大小和編譯時指定的大小,它們應該是可以互換的。在編譯時指定大小隻能提高性能。

您可以通過在給定實施中用std::array/boost::array替代std::vector來實施您的建議。如果模板參數僅用於定義運行時參數,則不會獲得任何結果。

2

即矢量變化的尺寸

如果尺寸不是在編譯時已知的空間,它不能是一個模板參數。期。

模板在編譯時更加強大,但代價是運行時具有一定的靈活性。

+0

在這個例子中,不使用模板不會更靈活,因爲您只需將大小檢查移動到運行時,這當然會非常緩慢。 –