Boost的动态多维数组-multi_array

Boost.MultiArray是一个动态多维数组库。它实现了一个通用、与标准库的容器一致的接口,并且具有与C++中内建的多维数组一样的接口和行为。

简短的例子

以下是使用 multi_array 的一个简短例子:

  1. #include "boost/multi_array.hpp"
  2. #include <cassert>
  3.  
  4. int main () {
  5.   // 创建一个 3 x 4 x 2 的 3D 数组
  6.   typedef boost::multi_array<double, 3> array_type;
  7.   typedef array_type::index index;
  8.   array_type myarray(boost::extents[3][4][2]);
  9.  
  10.   // 赋值到数组的元素
  11.   int values = 0;
  12.   for(index i = 0; i != 3; ++i)
  13.     for(index j = 0; j != 4; ++j)
  14.       for(index k = 0; k != 2; ++k)
  15.         myarray[i][j][k] = values++;
  16.  
  17.   // 校验元素值
  18.   int verify = 0;
  19.   for(index i = 0; i != 3; ++i)
  20.     for(index j = 0; j != 4; ++j)
  21.       for(index k = 0; k != 2; ++k)
  22.         assert(myarray[i][j][k] == verify++);
  23.  
  24.   return 0;
  25. }

上面的代码可以告诉我们这样一些信息:

  • boost::multi_array是一个模板类,第一个模板参数指定元素数据类型;第二个模板参数是一个数值,指出数组维度。
  • multi_array::index类型定义用于描述数据索引,一般来说它就是int
  • boost:: extents的连续多个[]操作用于指明每个维度的大小(另外,也可以使用boost::array来指明维度大小,如boost:: array<int,3> dims={ 3,4,2}; array_type myarray(dims);)
  • boost::multi_array的读写接口和原生多维数组相同

把连续内存适配成多维数组

有时我们需要把已有的一段连续内存(比如一维数组)当作多维数组使用,Boost.MultiArray提供了multi_array_ref和const_multi_array_ref类用于把原始内存块适配成多维数组。

如,可以如下修改前例的代码,在这个代码里使用multi_array_ref代替multi_array,它把double buf[24]适配成了“double A[3][4][2]”:

  1. /* 原来的代码
  2.   typedef boost::multi_array<double, 3> array_type;
  3.   typedef array_type::index index;
  4.   array_type myarray(boost::extents[3][4][2]);
  5. */
  6.   typedef boost::multi_array_ref<double, 3> array_type;
  7.   typedef array_type::index index;
  8.   double buf[24]; //连续内存块
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值