首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过initializer-list初始化n维数组

通过initializer-list初始化n维数组
EN

Stack Overflow用户
提问于 2021-04-16 20:57:02
回答 1查看 73关注 0票数 0

我一直对C++中默认数组的初始化感到不满,所以我想创建一个类似python的ndarray类。

但是我遇到了一个障碍,我找不到任何关于如何编写这种代码的信息

代码语言:javascript
复制
...
// 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:

代码语言:javascript
复制
ndArray arr = {{1,0,0},{0,1,0},{0,0,1}};

编辑:我认为我不太擅长将正确的重点放在正确的单词上,但在这里,我想在不显式地为每个维度编写代码的情况下进行泛化

编辑:

我想我现在有了正确的想法,但还没有完全做到。感谢@Nicholas Pilotto,但在您的例子中,它会产生这样的类

代码语言:javascript
复制
// one-dimensional
ndArray<int> first;

// two-dimensional
ndArray<ndArray<int>> second; 

// .. and so on 

如果你需要三维数组,你需要嵌套它们。这对用户来说是不希望的。我认为它以某种方式涉及到了构造器的模板化

代码语言:javascript
复制
template<typename T>
class ndArray {
    template<typename N>
    ndArray(std::initializer_list<N> list) {
        // do stuff there
    }
}

但它以某种方式涉及到知道模板N的“深度”以确定ndArray的维度。也许有一种方法可以用模板做到这一点呢?

EN

回答 1

Stack Overflow用户

发布于 2021-04-16 21:21:24

您必须定义一个接受std::initializer_list<std::initializer_list<T>>的构造函数

代码语言:javascript
复制
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;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67125665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档