如何使用二维initializer_list进行初始化
How do I initialize with a 2 dimensional initializer_list?
我知道,该向量类是按以下方式初始化的:
Vector::Vector(initializer_list<double> lst)
:size{static_cast<int>(lst.size())},elem{new double[static_cast<int>(lst.size())]}
{
copy(lst.begin(),lst.end(),elem);
}
这是我的矩阵类:
class Matrix{
private:
int row;
int col;
double elem**
public:
//Default Constructor:
Matrix(int row,int col);
//Initialized list constructor:
Matrix(initializer_list<initializer_list<double>> lst);
我想,我应该在初始化列表中使用初始化的 lis 来创建初始化的矩阵。从语法的角度来看,我该怎么做?
这与你用于Vector
的原理相同,但通过列表列表进行迭代:
Matrix(initializer_list<initializer_list<double>> lst) :
row{lst.size()},
col{0} // not sure if all cols are same size
{
for (auto &x: lst) // iterate through outer list to find largest inner list
if (x.size()>col)
col = x.size();
cout<<row<<"x"<<col<<endl; // educational purpose only -> remove
elem=new double*[row];
auto it=lst.begin(); // iterate through outer list
for (int i=0; i<row; i++, it++) {
elem[i]=new double[col];
std::copy(it->begin(),it->end(),elem[i]); // copy current inner list
}
}
有了这个,您可以处理2D列表,例如:
Matrix m{ {1,2,3},{4,5,6},{7,8,9}};
在线演示
重要评论:手动管理内存总是很痛苦且容易出错。 使用std::vector
而不是指向动态分配的数组的指针会更容易。 对于矩阵,您可以选择向量向量,也可以选择带有某些公式的扁平向量,以查找给定行和列的元素。
我建议使用std::array
:
#include <array>
template<int ROWS, int COLUMS>
using Matrix = std::array<std::array<double, COLUMS>, ROWS>;
Matrix<3,3> m{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
或std::vector
:
#include <vector>
using Matrix = std::vector<std::vector<double>>;
Matrix m{ {1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0} };
或从std::vector
派生的class Matrix
:
#include <vector>
class Matrix
: public std::vector<std::vector<double>>
{
public:
Matrix( std::vector<std::vector<double>> && m )
: std::vector<std::vector<double>>( m )
{}
};
Matrix m( { {1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0} } );
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 包含 std::list 的结构体的 C++ 初始化
- 正在初始化:无法从'_Ty*'转换为 List<int,std::分配器<节点<T>>>:节点*
- 在 C 语言中初始化 List<List> 的优雅方式<Coordinate>#
- 为什么不能从初始值设定项列表初始化我的类,即使它派生自 std::list?
- 错误:没有用于初始化'List<double>::node'的匹配构造函数
- 我正在收到错误的“ list :: ShowList”:功能风格的初始化器似乎是我的CPP文件中的函数定义'
- 如何使用给定数量的元素初始化boost::python::list
- 如何从类访问和初始化 std::list
- 我可以使用“brace init list”初始化包含“std::string”字段的结构吗