2

我有一个 Matrix 类,它必须有一个接受未初始化列表的构造函数。构造函数必须获取值并将它们放入 2D 向量、矩阵中。

这是我的二维向量。

vector<vector<double>> d_matrix;

这是我的构造函数。

Matrix::Matrix(initializer_list<initializer_list<int>> list)
{
    d_row = list.size();
    d_col = (*list.begin()).size();

    initMatrix();

    for (size_t r = 0; r < d_row; ++r)
    {
        for (size_t c = 0; c < d_col; ++c)
        {
            /* I need to do something here */
            //d_matrix[r][c] = list.begin() + r) + c);
            //cout << (*list.begin()).;
        }
    }
}

这是我的初始化矩阵函数,从初始值开始。

void Matrix::initMatrix()
{
    d_matrix.resize(d_col, vector<double>(d_row, 0)); 
}

这就是我调用构造函数的方式。

Matrix m({ {1, 2, 3},
           {3, 4, 2} }
         );

我设法获得了列表的尺寸(d_row 和 d_col),但是我坚持尝试从列表中提取值,也尝试了插入,并且迭代器开始和结束。未初始化的列表类似乎只有两个迭代器方法和一个大小方法。我正在使用命名空间标准btw。

问题是,如何从未初始化列表中获取值并将它们存储到我称为 d_matrix 的 2D 向量中。

4

2 回答 2

6

首先:你应该在构造函数定义中的参数列表之后初始化初始化列表中的成员,否则你正在做赋值。而且您还应该将您的std::initializer_listas引用传递给 const以避免不必要的复制。

Matrix::Matrix(const std::initializer_list<std::initializer_list<int>>& list)
    : d_row(list.size()), d_col((*list.begin()).size()) {
    // ...
}

其次:不要resize在向量上使用默认构造向量元素,而是reserve像这样使用:

d_matrix.reserve(d_row); // Allocate storage for vector elements.

实际上没有必要为嵌套向量中的元素分配内存,因为它们是内置类型double(无 ctor)。

第三:如果std::initializer_list<int>将构造函数中嵌套参数的元素类型更改为double,如下所示:

Matrix(const std::initializer_list<std::initializer_list<double>>& list)

然后,在构造函数中将元素传输到矩阵所需要做的就是:

for (const auto& l : list) {
    d_matrix.emplace_back(l);
}

活生生的例子

如果您想保留int类型并进行显式转换,您可以执行以下操作:

d_matrix.resize(d_row, std::vector<double>(d_col, 0));
decltype(d_row) r = 0;
for (const auto& l : list) {
    decltype(d_col) c = 0;
    for (const auto d : l) {
        d_matrix[r][c++] = d;
    }
    ++r;
}
于 2013-11-07T17:02:45.987 回答
0

因为它是一个构造函数,所以你不需要在它内部调用成员函数 initMatrix。

我认为使用下面的代码片段就足够了(无需测试):

d_matrix.resize( list.size() );
std::vector<std::vector<double>>::size_type i = 0;
for ( const std::initializer_list<int> &l : list )
{
   d_matrix[i].reserve( l.size() );
   for ( int x : l ) d_matrix[i].push_back( x );
   ++i;
}

对不起。似乎可以更简单地完成。

d_matrix.resize( list.size() );
std::vector<std::vector<double>>::size_type i = 0;
for ( const std::initializer_list<int> &l : list )
{
   d_matrix[i].assign( l );
   ++i;
}

也许你甚至可以写一行代码

d_matrix.assign( list );
于 2013-11-07T16:03:32.553 回答