2017-10-25 1 views
-1

素敵な基本クラスMatrixを開発しようとしています。コンテナはdata_type(テンプレート引数)へのポインタです。行列のエレガントなコンストラクタと中かっこ

は、私がこのように私のマトリックスを構築できる方法を見つけ出すのが好きI'would:

Matrix<type> mat = { {1,2,3}, {4,5,6} }; 

今パラメータの任意の数は、このコンストラクタを使用している与えられて構築する唯一の方法:

//--- construct by list of arguments 
template<typename data_type> 
template <typename ... Ts> 
constexpr Matrix<data_type>::Matrix(std::size_t row , 
            std::size_t col , 
            Ts&&... args ) noexcept : row{row}, columns{col}, 
                    data{ new data_type[row*col] } 

{  
     assert(sizeof...(args) == row*columns); 

     std::initializer_list<data_type> il ({ std::forward<Ts>(args)... }); 
     std::copy(il.begin(), il.end(), data); 
} 

が、私は、ユーザー側のコードでは、このがらくたの表現を使用する必要があり、これを使用する:

Matrix<double> m3(3,2,1.12,2.434,3.546546,4.657,5.675675,6.542354); 

あなたの貴重なご支援に感謝します!

私はこの解決策を見つけました。しかし、もっと良い方法があるかどうかは分かりません....ここでは完全にコードです(私はこのコンストラクタを使って行列クラスを作成しました試してください):

# include <iostream> 

# include <initializer_list> 
# include <iterator> 




using namespace std; 

template <typename data_type> 
class Matrix { 
    public: 

    constexpr Matrix(std::initializer_list<std::initializer_list<data_type>> rows) { 

      size_t row = rows.size() ; 
      cout << "Here" << endl;  
      auto il = *(rows.begin()); 
      size_t col = il.size(); 
      cout << row << ' ' << col << endl; 


      size_t i=0; 

      size_t n = row * col; 

      cout << n << endl;; 
      data = new data_type[ n ]; 
      i=0; 
      for(auto& row : rows) 
        for(auto & r : row){ 
         data[i] = r ; 
         i++; 
        } 
      for (i=0; i < n ; i++) 
        cout << data[i] << endl; 




    } 

    private: 

    data_type* data; 

}; 





int main(){ 


     Matrix<int> mat = {{1,2,3}, {4,5,6}}; 


    return 0; 
} 
+0

ネストされたイニシャライザリストはどうですか?何かが好きです:テンプレート行列(std :: initializer_list >行) –

+0

これはプログラミングの練習問題ですか?そうでない場合は、[Eigen](http://eigen.tuxfamily.org)のような非常に最適化された線形代数ライブラリの多くを使用することはできません。 – Darhuuk

+0

エクササイズではありません...私は特別な操作で私のマトリックスクラスを開発したいと思っています:) –

答えて

0

この作品は次のようなものですか?

#include <cstddef> 
#include <initializer_list> 
#include <iostream> 
#include <vector> 

template<typename data_type> 
class Matrix { 
public: 

     constexpr Matrix(std::initializer_list<std::initializer_list<data_type>> rows) { 
       // Add rows to data 
       data.reserve(rows.size()); 
       for (auto &row : rows) 
         data.push_back(std::vector<data_type>{row}); 
     } 

private: 

     // 2-D array-type for storing data 
     std::vector<std::vector<data_type>> data; 

}; 

int main() { 
     // New matrix: 
     // 1 2 3 
     // 4 5 6 
     Matrix<int> mat = {{1, 2, 3}, {4, 5, 6}}; 

     return 0; 
} 
+0

は素敵に見えますが、私は理解できません..どうすれば行と列のインデックスを管理できますか?初期化からこのデータを保存する方法(行列の2サイズ) –

+0

「インデックスを管理する」とは、行と列の数を取得できるようにすることですか?使用例を表示するために質問を更新してもよろしいですか? –

関連する問題