如何从2D initializer_list中读取值并将它们放在2D矢量中

时间:2013-11-07 15:44:37

标签: c++ stdvector

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

这是我的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()).;
        }
    }
}

这是我的init Matrix函数,以初始值开始。

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),但是我仍然试图从列表中提取值,尝试使用插入以及迭代器的开始和结束。未初始化的列表类似乎只有两个迭代器方法和一个size方法。我正在使用命名空间 std btw。

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

2 个答案:

答案 0 :(得分:6)

首先:您应该在构造函数定义中的参数列表之后初始化初始化列表中的成员,否则您正在进行赋值。您还应该将std::initializer_list作为引用传递给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(无ctors)。

第三:如果您将构造函数中嵌套的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);
}

Live example

如果你想保留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;
}

答案 1 :(得分:0)

由于它是构造函数,因此您无需在其内部调用成员函数initMatrix。

我认为使用fllowing代码片段(不进行测试)就足够了:

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