问题描述
我总是对 C++ 中默认数组的初始化感到不安,所以我想像在 python 中一样创建一个 ndarray 类。
但是我遇到了一个障碍,我找不到任何关于如何制作这种代码的信息
...
// for 1-d
ndarray(std::initializer_list<T> list){
...
}
// for 2-d
ndarray(std::initializer_list<std::initializer_list<T>> list){
...
}
// for 3-d
ndarray(std::initializer_list<std::initializer_list<std::initializer_list<T>>> list){
...
}
...
适用于任何嵌套的初始化列表(!)
所需的结果是按照以下方式构造 ndarray:
ndarray arr = {{1,0},{0,1,1}};
编辑: 我认为将正确的重点放在正确的词上有点不好,但在那里我想概括一下,而无需为每个维度明确编写代码
解决方法
您必须定义一个接受 std::initializer_list<std::initializer_list<T>>
的构造函数
template <class T>
class ndArray {
public:
T* p;
ndArray(initializer_list<initializer_list<T>> l) : p(new T[l.size() * l.begin()->size()]) {
unsigned int i = 0;
unsigned int j = 0;
auto it = l.begin();
auto end = l.end();
for (; it != end; it++) {
auto iit = (*it).begin();
auto iend = (*it).end();
for (; iit != iend; iit++) {
*(p + i + j) = *iit;
j++;
}
i++;
j = i;
}
}
}