矩阵优雅的构造函数与卷曲的手镯

时间:2017-10-25 18:33:52

标签: c++ matrix

我试图开发一个不错的基本类Matrix,它的容器是一个更简单的指向data_type(模板参数)的指针;

我想知道如何以这种方式构建我的Matrix:

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

但是为了使用它,我必须在用户端代码中使用这个crap表达式:

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

1 个答案:

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