通过初始值设定项列表初始化n维数组 我一直对C++中缺省数组的初始化感到不满,所以我想用Python来生成一个NDARRAY类。
但是我遇到了一个障碍,我找不到任何关于如何制作这种代码的信息通过初始值设定项列表初始化n维数组 我一直对C++中缺省数组的初始化感到不满,所以我想用Python来生成一个NDARRAY类。,c++,templates,containers,initializer-list,C++,Templates,Containers,Initializer List,但是我遇到了一个障碍,我找不到任何关于如何制作这种代码的信息 。。。 //一维 ndArray(标准::初始值设定项列表){ ... } //二维 ndArray(标准::初始值设定项列表){ ... } //三维 ndArray(标准::初始值设定项列表){ ... } ... 任何嵌套初始值设定项列表的常规(!) 预期的结果是以以下方式构建ndarray: ndArray arr={{1,0,0},{0,1,0},{0,0,1}; 编辑: 我认为我不太擅长正确地强调正确的单词,但在这里我
。。。
//一维
ndArray(标准::初始值设定项列表){
...
}
//二维
ndArray(标准::初始值设定项列表){
...
}
//三维
ndArray(标准::初始值设定项列表){
...
}
...
任何嵌套初始值设定项列表的常规(!)
预期的结果是以以下方式构建ndarray:
ndArray arr={{1,0,0},{0,1,0},{0,0,1};
编辑:
我认为我不太擅长正确地强调正确的单词,但在这里我想概括一下,没有为每个维度显式地编写代码你必须定义一个接受
std::initializer\u列表的构造函数
模板
班轮{
公众:
T*p;
ndArray(初始值设定项列表l):p(新的T[l.size()*l.begin()->size()){
无符号整数i=0;
无符号整数j=0;
自动it=l.begin();
自动结束=l.结束();
for(;it!=end;it++){
自动iit=(*it.begin();
自动iend=(*it.end();
对于(;iit!=iend;iit++){
*(p+i+j)=*iit;
j++;
}
i++;
j=i;
}
}
}
我想问题是如何在不为每个维度显式编写代码的情况下对其进行概括。我想你是对的,我将编辑我的博文主题外建议:尽可能避免直接堆内存管理。在这种情况下,考虑一个智能指针,用于<代码> P<代码>。@ Max 66 i使用它是为了理解一个迭代器对于<代码> STD::初始化语言列表是“代码> T const */CODE >,但这是一个坏主意,依赖于它:如果您为另一个容器重新使用代码,这就不再是真的了。建议:使用auto
(auto-it=l.cbegin();
和auto-end=l.cend();
)生成一个对每个标准容器都有效的代码。您只需为一维数组实现它,为构造函数提供std::initializer\u list
。然后,如果您创建一个ndArray
对象,它将提供一个std::initializer\u list
(本质上是std::initializer\u list
和T=ndArray
)构造函数,该构造函数可以满足您的需要。
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;
}
}
}