C 11使用vectorinitilizer列表的任何类型的动态多维数组

C 11使用vectorinitilizer列表的任何类型的动态多维数组,第1张

概述如何创建一个多维数组(矩阵),其维度在运行时确定. 最好的方法似乎是采用建筑尺寸向量,并采用偏移矢量来访问单个元素 这也将允许使用初始化列表: 这应该采用在编译时确定的类型矩阵,因此模板是有意义的 应适当使用C 11特征,为lambdas提供奖励积分 用法示例: int main(int, char **){ static const std::size_t d1{2}; 如何创建一个多维数组(矩阵),其维度在运行时确定.

最好的方法似乎是采用建筑尺寸向量,并采用偏移矢量来访问单个元素

这也将允许使用初始化列表:

这应该采用在编译时确定的类型矩阵,因此模板是有意义的

应适当使用C 11特征,为lambdas提供奖励积分

用法示例:

int main(int,char **){        static const std::size_t d1{2};        static const std::size_t d2{3};        static const std::size_t d3{4};        multi_vec<std::size_t> q({d1,d2,d3});        for (std::size_t i1=0; i1 < d1; ++i1)                for (std::size_t i2=0; i2 < d2; ++i2)                        for (std::size_t i3=0; i3 < d3; ++i3)                                q[{i1,i2,i3}]=foo(i1,i3);        for (std::size_t i1=0; i1 < d1; ++i1)                for (std::size_t i2=0; i2 < d2; ++i2)                        for (std::size_t i3=0; i3 < d3; ++i3)                                std::cout << "{"                                        << i1 << ","                                        << i2 << ","                                        << i3 << "}=> "                                        << foo(i1,i3) << "=="                                        << q[{i1,i3}]                                        << ((foo(i1,i3) == q[{i1,i3}])                                              ? " good" : " ERROR")                                << std::endl;};
解决方法 这实际上是使用lambdas和std :: for_each以及unique_ptr进行内存管理的好地方:
template <class T>class multi_vec{public:    using param=std::vector<size_t>;    explicit multi_vec(const param& dimensions)        : dim{dimensions},prod {1}    {        std::for_each(dim.begin(),dim.end(),[this] (std::size_t val)        {            mult.emplace_back(prod);            prod *= val;        } );        ptr.reset(new T[prod]);    }    std::size_t capacity() const { return prod; }    // undefined if elements in lookup != elemenets in dim    // undefined if any element in lookup        // is greater than or equal to corresponding dim element    T& operator[](const param& lookup)    {        return ptr[get_offset(lookup)];    }    const T operator[](const param& lookup) const    {        return ptr[get_offset(lookup)];    }private:    std::size_t get_offset(const param& lookup) const    {        std::size_t offset=0;        auto mit=mult.begin();        std::for_each(lookup.begin(),lookup.end(),[&offset,&mit] (std::size_t val)        {            offset+=*mit * val;           ++mit;        } );        return offset;    }    param dim;    param mult;    std::size_t prod;    std::unique_ptr<T[]> ptr;};

这使用单维数组进行实际存储,并缓存乘法器以便重用由于正常的多维数组,例如x [2] [3] [4]不限制检查,超出范围被视为未定义,而不是不断检查可能有效的值.同样地,不检查diminsionality的查找,如果需要,可以添加静态成员来检查参数是否有效,就边界或维度而言.

总结

以上是内存溢出为你收集整理的C 11使用vector / initilizer列表的任何类型的动态多维数组全部内容,希望文章能够帮你解决C 11使用vector / initilizer列表的任何类型的动态多维数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存