通过初始化器列表初始化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},{0,1,0},{0,0,1}};

编辑:我认为我有点不善于把正确的重点放在正确的单词上,但在那里我想概括一下,而不是明确地为每个维度编写代码

编辑:

我想我现在的想法是对的,但还没有完全实现。感谢@Nicholas Piloto,但在你的情况下,它会产生这些类

// one-dimensional
ndArray<int> first;
// two-dimensional
ndArray<ndArray<int>> second; 
// .. and so on 

如果你需要三维阵列,你需要嵌套这些。这对于用户来说是不希望的。我认为它在某种程度上涉及到对构造函数进行模板化

template<typename T>
class ndArray {
template<typename N>
ndArray(std::initializer_list<N> list) {
// do stuff there
}
}

但不知何故,它涉及到知道模板N的"深度"来确定ndArray的维度。也许有一种方法可以用模板做到这一点?

您必须定义一个接受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;
}
}
}

最新更新