如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?
How to initialize a 2D C-style array from a nested std::initializer_list?
我正在创建一个Matrix<type, width, height>
类,我希望能够使用initializer_list
初始化,例如:
Matrix<int, 2, 2> mat = Matrix<int, 2, 2>{ {1,2},{3,4} };
矩阵是使用T[height][width]
2D 数组实现的。
为此,我尝试制作一个构造函数,例如:
Matrix(std::initializer_list< std::initializer_list<T>> input);
但是,我不知道如何从列表中填充数组。我试过了
使用
memcpy
(损坏的内存(,std::copy
(似乎无法从std::initializer_list
(,- 以及使用赋值运算符和构造函数调用
()
(但 2D 数组不可分配,并且 (( 构造函数调用不 编译(。
有没有其他方法,最好是尽可能安全的方法可以做到这一点?
您应该为Matrix(std::initializer_list</* here */> list);
提供确切的类型。 然后要填充数组,您需要遍历传递的列表并填充数组。(在线观看直播(
#include <initializer_list> // std::initializer_list
template<typename T, std::size_t R, std::size_t C>
class Matrix
{
T mArray2D[R][C]{};
public:
Matrix(const std::initializer_list<T[C]> list)
// ^^^^^ --> type of the row
{
auto iter{ list.begin() }; // returns pointer to T[C]
for (std::size_t row{}; row < R; ++row)
{
const auto& rowElements{ *iter };
for (std::size_t col{}; col < C; ++col)
{
mArray2D[row][col] = rowElements[col];
}
++iter;
}
}
};
现在,在main()
中,您可以使用初始值设定项列表初始化Matrix
,如下所示:
Matrix<int, 2, 2> mat{ {1,2}, {3,4} };
// or
// Matrix<int, 2, 2> mat = { {1,2}, {3,4} };
如果可以使用std::array
,则可以执行以下操作。(在线观看直播(
#include <iostream>
#include <array> // std::array
#include <initializer_list> // std::initializer_list
template<typename T, std::size_t R, std::size_t C>
class Matrix
{
using RowType = std::array<T, C>;
T mArray2D[R][C]{};
public:
Matrix(const std::initializer_list<RowType> list)
{
auto iter{ list.begin() };
for (std::size_t row{}; row < R; ++row)
{
const RowType& rowElements{ *iter };
for (std::size_t col{}; col < C; ++col)
{
mArray2D[row][col] = rowElements[col];
}
++iter;
}
}
};
如果类中的多维数组可以是类型T
的std::array
的std::array
,您也可以使用std::copy
。(在线观看直播(
#include <iostream>
#include <array> // std::array
#include <initializer_list> // std::initializer_list
#include <algorithm> // std::copy
template<typename T, std::size_t R, std::size_t C>
class Matrix
{
using RowType = std::array<T, C>;
using Array2D = std::array<RowType, R>;
Array2D mArray{ RowType{} }; // initialize the matrix
public:
Matrix(const std::initializer_list<RowType> list)
{
std::copy(list.begin(), list.end(), mArray.begin());
}
};
相关文章:
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 在C++中初始化和打印 2D 数组
- 有没有办法使用输入的维度初始化 2d 数组中的所有项目而不循环C++?
- 如何从initializer_list初始化 2D 数组
- 初始化空的 2D 矢量?
- 如何从文件中读取值,然后使用它们来初始化 2D 数组C++
- 如何初始化所有值相同的 2D 数组?
- 为什么不能用两层列表初始值设定项初始化 2D std::array?
- 如何在 c++ 中初始化字符串的 2D 数组
- 如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?
- C++ 2D shared_ptr数组使用抽象多态类型初始化
- 从另一个类C++的构造函数初始化 2D 数组
- 2D 矢量初始化:初始化设置奇怪的长度
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?
- C++初始化并用变量填充 2D 数组
- 如何声明和初始化一个特定尺寸向量的2D数组
- 在构造函数中初始化 2D 数组
- 如何初始化2D向量C
- 在类的构造函数中初始化 2D 向量