通过初始化列表初始化一个 n 维数组

问题描述

我总是对 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;
        }
    }
}