iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ Boost MultiArray简化使用多维数组库
  • 508
分享到

C++ Boost MultiArray简化使用多维数组库

C++ Boost MultiArrayC++ Boost MultiArray库C++ 多维数组简化 2022-11-13 19:11:08 508人浏览 八月长安
摘要

目录一、介绍Boost.MultiArray二、示例一、介绍Boost.MultiArray Boost.MultiArray Boost.MultiArray 是一个简化使用多维数

一、介绍Boost.MultiArray

Boost.MultiArray

Boost.MultiArray 是一个简化使用多维数组的库。最重要的优点是多维数组可以像标准库中的容器一样使用。例如,有一些成员函数,例如 begin() 和 end(),让您可以通过迭代器访问多维数组中的元素。迭代器比通常用于 C 数组的指针更易于使用,尤其是对于具有多个维度的数组。

二、示例

示例 19.1。带有 boost::multi_array 的一维数组

#include <boost/multi_array.hpp>
#include <iOStream>
int main()
{
  boost::multi_array<char, 1> a{boost::extents[6]};
  a[0] = 'B';
  a[1] = 'o';
  a[2] = 'o';
  a[3] = 's';
  a[4] = 't';
  a[5] = '\0';
  std::cout << a.origin() << '\n';
}

Boost.MultiArray 提供类 boost::multi_array 来创建数组。这是提供的最重要的类。它在 boost/multi_array.hpp 中定义。

boost::multi_array 是一个需要两个参数的模板:第一个参数是要存储在数组中的元素的类型。第二个参数确定数组应该有多少维。

第二个参数只设置维度的数量,而不是每个维度中的元素数量。因此,在示例 19.1 中,a 是一维数组。

维度中的元素数量是在运行时设置的。示例 19.1 使用全局对象 boost::extents 来设置维度大小。该对象被传递给 a 的构造函数。

boost::multi_array 类型的对象可以像普通的 C 数组一样使用。通过将索引传递给 operator[] 来访问元素。示例 19.1 将五个字母和一个空字符存储在 a - 一个包含六个元素的一维数组中。 origin() 返回指向第一个元素的指针。该示例使用此指针将存储在数组中的单词 -Boost - 写入标准输出。

与标准库中的容器不同,operator[] 检查索引是否有效。如果索引无效,程序将使用 std::abort() 退出。如果您不想检查索引的有效性,请在包含 boost/multi_array.hpp 之前定义宏 BOOST_DISABLE_ASSERTS。

示例 19.2。二维数组的视图和子数组

#include <boost/multi_array.hpp>
#include <alGorithm>
#include <iostream>
#include <cstring>
int main()
{
  boost::multi_array<char, 2> a{boost::extents[2][6]};
  typedef boost::multi_array<char, 2>::array_view<1>::type array_view;
  typedef boost::multi_array_types::index_range range;
  array_view view = a[boost::indices[0][range{0, 5}]];
  std::memcpy(view.origin(), "tsooB", 6);
  std::reverse(view.begin(), view.end());
  std::cout << view.origin() << '\n';
  boost::multi_array<char, 2>::reference subarray = a[1];
  std::memcpy(subarray.origin(), "c++", 4);
  std::cout << subarray.origin() << '\n';
}

Example19.2

example19.2 创建一个二维数组。第一个维度中的元素数设置为 2,第二个维度中的元素数设置为 6。将数组视为具有两行六列的表。

表的第一行将包含单词 Boost。由于这个词只需要存储五个字母,因此创建了一个视图,该视图正好跨越数组的五个元素。

基于类 boost::multi_array::array_view 的视图允许您访问数组的一部分并将该部分视为单独的数组。

boost::multi_array::array_view 是一个模板,它将视图中的维数作为模板参数。在示例 19.2 中,视图的维数为 1。由于数组 a 有两个维度,因此忽略了一个维度。为了省去Boost这个词,一维数组就足够了;更多的维度会令人困惑。

与 boost::multi_array 一样,维数作为模板参数传入,每个维的大小在运行时设置。但是,对于 boost::multi_array::array_view,这不是通过 boost::extents 完成的。相反,它是通过 boost::indices 完成的,这是 Boost.MultiArray 提供的另一个全局对象。

与 boost::extents 一样,索引必须传递给 boost::indices。虽然只能将数字传递给 boost::extents,但 boost::indices 也接受范围。这些是使用 boost::multi_array_types::index_range 定义的。

在示例 19.2 中,传递给 boost::indices 的第一个参数不是范围,而是数字 0。传递数字时,您不能使用 boost::multi_array_types::index_range。在示例中,视图将采用 a 的第一个维度——索引为 0 的维度。

对于第二个参数,boost::multi_array_types::index_range 用于定义范围。通过将 0 和 5 传递给构造函数,a 的第一个维度的前五个元素可用。范围从索引 0 开始,到索引 5 结束——不包括索引 5 处的元素。第一维中的第六个元素被忽略。

因此,视图是一个由五个元素组成的一维数组——a 的第一行中的前五个元素。当访问视图以使用 std::memcpy() 复制字符串并使用 std::reverse() 反转元素时,这种关系无关紧要。创建视图后,它就像一个具有五个元素的独立数组。

当对 boost::multi_array 类型的数组调用 operator[] 时,返回值取决于

方面。在示例 19.1 中,运算符返回 char 元素,因为访问的数组是一维的。

在示例 19.2 中,a 是一个二维数组。因此,operator[] 返回子数组而不是 char 元素。因为子数组的类型不是公开的,所以必须使用 boost::multi_array::reference。此类型与 boost::multi_array::array_view 不同,即使子数组的行为类似于视图。视图必须明确定义并且可以跨越数组的任意部分,而子数组由 operator[] 自动返回并跨越每个维度中的所有元素。

示例 19.3。使用 boost::multi_array_ref 包装 C 数组

#include <boost/multi_array.hpp>
#include <algorithm>
#include <iostream>
#include <cstring>
int main()
{
  char c[12] =
  {
    't', 's', 'o', 'o', 'B', '\0',
    'C', '+', '+', '\0', '\0', '\0'
  };
  boost::multi_array_ref<char, 2> a{c, boost::extents[2][6]};
  typedef boost::multi_array<char, 2>::array_view<1>::type array_view;
  typedef boost::multi_array_types::index_range range;
  array_view view = a[boost::indices[0][range{0, 5}]];
  std::reverse(view.begin(), view.end());
  std::cout << view.origin() << '\n';
  boost::multi_array<char, 2>::reference subarray = a[1];
  std::cout << subarray.origin() << '\n';
}

类 boost::multi_array_ref 包装了一个现有的 C 数组。在示例 19.3 中,a 提供与 boost::multi_array 相同的接口,但不分配内存。使用 boost::multi_array_ref,一个 C 数组——不管它有多少维——都可以被视为一个 boost::multi_array 类型的多维数组。 C 数组只需要作为附加参数添加到构造函数中。

Boost.MultiArray 还提供了 boost::const_multi_array_ref 类,它将 C 数组视为常量多维数组。

到此这篇关于C++ Boost MultiArray简化使用多维数组库的文章就介绍到这了,更多相关C++ Boost MultiArray内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ Boost MultiArray简化使用多维数组库

本文链接: https://www.lsjlt.com/news/170621.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ Boost MultiArray简化使用多维数组库
    目录一、介绍Boost.MultiArray二、示例一、介绍Boost.MultiArray Boost.MultiArray Boost.MultiArray 是一个简化使用多维数...
    99+
    2022-11-13
    C++ Boost MultiArray C++ Boost MultiArray库 C++ 多维数组简化
  • C#二维数组与多维数组如何使用
    这篇文章主要介绍“C#二维数组与多维数组如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#二维数组与多维数组如何使用”文章能帮助大家解决问题。C# 中同样支持多维数组(也可称为矩形数组),它...
    99+
    2023-07-05
  • C#二维数组与多维数组的具体使用
    目录1、二维数组2、初始化二维数组3、访问二维数组种的元素C# 中同样支持多维数组(也可称为矩形数组),它可以是二维的,也可以是三维的,多维数组中的数据以类似表格(行、列)的形式存储...
    99+
    2023-05-15
    C#二维数组与多维数组 C#二维数组 C#多维数组
  • php多维数组如何使用
    PHP是一种常见的服务器端脚本语言,广泛应用于Web开发领域。在PHP中,多维数组是一种非常重要的数据类型,可以用来存储和处理复杂的数据结构。本文将介绍PHP多维数组的基本概念、创建和访问方式以及常用的操作方法。1.多维数组的概念多维数组是...
    99+
    2023-05-19
  • C++中如何使用auto表示多维数组指针
    C++中如何使用auto表示多维数组指针,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。多维数组的指针多维数组是一种常见的数据结构,实际上是数组的数组。这个含义虽...
    99+
    2023-06-19
  • C++中如何使用二维数组
    C++中如何使用二维数组,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++二维数组new应用方式一:A (*ga)[n] = new&nbs...
    99+
    2023-06-17
  • 如何使用C++数组指针和二维数组
    这篇文章主要介绍“如何使用C++数组指针和二维数组”,在日常操作中,相信很多人在如何使用C++数组指针和二维数组问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用C++数组指针和二维数组”的疑惑有所帮助!...
    99+
    2023-06-25
  • 怎么在C语言中使用多维数组和结构体
    本篇内容介绍了“怎么在C语言中使用多维数组和结构体”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目:有一个颜色集合,里面有若干个颜色值(R...
    99+
    2023-06-08
  • 如何在C语言中使用多维数组和结构体
    如何在C语言中使用多维数组和结构体?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1887 颜色精简题目:有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现...
    99+
    2023-06-15
  • C++ 使用 new 创建二维数组实例
    目录1. 直接创建2. 借助指针数组3. 借助 std::vector1. 直接创建 C++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针...
    99+
    2023-01-12
    c++用new创建二维数组 C++使用new语句生成二维数组 c++ new二维数组
  • C语言多维数组可以用来做什么
    C语言的多维数组可以用来存储和处理多维数据结构,例如矩阵、图像、表格等。它可以用于表示和操作二维和更高维度的数据。以下是多维数组的一...
    99+
    2023-10-12
    C语言
  • c语言多维数组初始化和赋值的方法是什么
    在C语言中,多维数组的初始化和赋值可以使用以下方法: 静态初始化:在定义数组时,直接给出各个元素的初始值。 int arr[3]...
    99+
    2023-10-23
    c语言
  • 在 PHP 中的多维数组中使用 Foreach 循环
    本文将介绍 PHP 中的多维数组。我们还将学习在多维数组中使用 foreach 循环。 在 PHP 中使用 foreach 循环访问多维数组的元素 多维数组在数组中包含一个或多个数组。 一个...
    99+
    2024-02-27
  • Java二维数组简单定义与使用方法示例
    本文实例讲述了Java二维数组简单定义与使用方法。分享给大家供大家参考,具体如下:Java的二维数组是先创建一个一维数组,然后该数组的元素再引用另外一个一维数组。在使用二维数组的时候,通过两个中括号[]来访问每一层维度的引用,直到访问到最终...
    99+
    2023-05-31
    java 二维数组 ava
  • PHP中怎么使用array_multisort()函数对多维数组排序
    这篇文章给大家介绍PHP中怎么使用array_multisort()函数对多维数组排序,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。PHP函数array_multisort()的工作方式:<php $d...
    99+
    2023-06-17
  • 使用runtime.Pinner将二维数组从Go传递到C
    问题内容 我试图将二维数组从 Go 传递到某个 C 函数 void foo(in **float, out *double)。因为我想要这个 C 函数的包装器,所以我希望 Go 函数具...
    99+
    2024-02-12
  • C语言一维数组怎么定义和使用
    在C语言中,一维数组的定义和使用如下:1. 定义一维数组:- 声明数组的类型和名称,例如:int arr[5];- 可以在声明时同时...
    99+
    2023-10-10
    c语言
  • python中如何在多维数组中使用随机数种子
    这篇文章将为大家详细讲解有关python中如何在多维数组中使用随机数种子,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。说明运行test_mult_shape函数,设定相同的随机数组,两次运行...
    99+
    2023-06-20
  • 如何使用Python处理多维数组中的异常数据?
    在数据分析和机器学习领域,我们通常需要处理多维数组中的异常数据。这些异常数据可能是由于传感器故障、数据采集错误或其他因素引起的。处理这些异常数据可以提高我们的数据质量和分析结果的准确性。 Python是一种功能强大的编程语言,它提供了许多...
    99+
    2023-09-11
    二维码 大数据 数组
  • 使用PHP的array_replace_recursive()函数替换多维数组中的元素
    使用PHP的array_replace_recursive()函数替换多维数组中的元素在开发PHP程序时,我们经常会遇到需要对多维数组进行操作的情况。例如,我们可能需要在一个多维数组中将某些元素进行替换或者更新。PHP提供了一个非常强大的函...
    99+
    2023-11-03
    PHP 多维数组 array_replace_recursive()
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作