C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C 11使用vector / initilizer列表的任何类型的动态多维数组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如何创建一个多维数组(矩阵),其维度在运行时确定.

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

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

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

应适当使用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列表的任何类型的动态多维数组所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。