微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迭代boost :: multi_array的尺寸

如何解决迭代boost :: multi_array的尺寸

|| 我正在尝试使用boost :: multi_array为c ++中的模板类编写一些与维度无关的代码(尽管如果其他容器/数据结构在这方面做得更好,我很乐意听到)。 给定一个尺寸,我想遍历所有其他尺寸的整个范围,并沿所选尺寸返回一维视图。这是相当简单的,或者至少看起来是来自boost文档。 我不知道怎么做是在编译时知道数组的维时,在数组的所有维上迭代选定的维。 有关如何执行此操作的任何建议?     

解决方法

        通常,您可以使用boost :: multi_array进行此操作,这里提供了一些示例代码来创建3D multi_array的2D视图:
#include \"boost/multi_array.hpp\"
#include <cassert>
#include <iostream>

int main()
{
    typedef boost::multi_array<double,3> array_type;
    typedef array_type::index index;

    array_type myArray3D(boost::extents[3][4][2]);

    // Assign values to the elements
    int values = 0;
    for (index i = 0; i != 3; ++i)
    {
            for (index j = 0; j != 4; ++j)
            {
                    for (index k = 0; k != 2; ++k)
                    {
                            myArray3D[i][j][k] = values++;
                    }
            }
    }
    // Verify values
    int verify = 0;
    for (index i = 0; i != 3; ++i)
    {
            for (index j = 0; j != 4; ++j)
            {
                    for (index k = 0; k != 2; ++k)
                    {
                            std::cout << \"[\" << i << \"]\";
                            std::cout << \"[\" << j << \"]\";
                            std::cout << \"[\" << k << \"] = \";
                            std::cout << myArray3D[i][j][k] << std::endl;
                            assert(myArray3D[i][j][k] == verify++);
                    }
            }
    }

    typedef boost::multi_array_types::index_range range;
    array_type::index_gen indices;

    // Create a new view with 2 dimentions fixing the 2nd dimention to 1
    array_type::array_view<2>::type myView =
    myArray3D[indices[range()][1][range()]];
    std::size_t numDims = myView.size();
    std::cout << \"numDims = \" << numDims << std::endl;

    for (index i = 0; i != 3; ++i)
    {
            for (index j = 0; j != 2; ++j)
            {
                    std::cout << \"[\" << i << \"]\";
                    std::cout << \"[\" << j << \"] = \";
                    std::cout << myView[i][j] << std::endl;
            }
    }

    return 0;
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。