如何从 2D initializer_list读取值并将其放入 2D 矢量中
How to read values from a 2D initializer_list and put them in a 2D vector
我有一个矩阵类,它必须有一个接受未初始化列表的构造函数。结构体必须获取值并将它们放入 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 矩阵函数。
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)的维度,但是我坚持尝试从列表中提取值,也尝试使用插入以及迭代器开始和结束。未初始化的列表类似乎只有两个迭代器方法和一个大小方法。顺便说一句,我正在使用命名空间标准。
问题是,如何从未初始化的列表中获取值并将它们存储到我称之为d_matrix的 2D 向量中。
首先:你应该在构造函数定义中的参数列表之后初始化初始化列表中的成员,否则你正在做赋值。您还应该将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);
}
现场示例
如果要保留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;
}
由于它是一个构造函数,因此您无需在其内部调用成员函数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 );
相关文章:
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 在C++中迭代 2D 容器的最干净方法
- 如何引用 2D 指针?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- C++动态安全 2D 交错阵列
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 2D 数组中的"Excess elements in scalar initializer"错误