C++ valarray获取(访问)对象方法详解

  • 内容
  • 评论
  • 相关

valarray 对象以序列的方式保存其中的元素。像之前说的那样,通过使用下标运算符来使用索引可以得到任何元素的引用,并能够获取或设置值。下面是一些示例:

std::valarray<int> data {1,2,3,4,5,6,7,8,9};
data[1] = data[2] + data[3]; // Data[1] is   7
data[3] *= 2; // Data[3] is   8
data[4] = ++data[5] - data[2];// data[4] is 4, data[5] is 7

这就像访问一般数组的元素一样。但是,valarray 对象的下标运算符有更多用处。可以用有下标运算符的辅助类的实例来代替索引。这使我们能够指定和访问元素的子集。辅助类定义的元素选择机制使它们可以用于元素,只要这些元素所在的数组是二维或更多维数的数组。理解这是如何工作的很重要,因为这是 valarray 超越序列容器的主要优势。

还有很多细节,因此让我们先看看大致的流程。我们首先会探讨元素选择机制一般是如何工作的,然后如何从二维数组中选择特定的行或列。会解释如何将辅助类用于 valarray 对象以不同方式选择的元素子集上,以及如何表示子集。在说明生成子集的各种可能方式之后,会讨论能对它们做些什么。在这之后,会展示如何将这些技术运用到应用的场景中。

创建切片

std::slice 类定义在 valarray 头文件中。由传给 valarray 对象的下标运算符的 slice 对象定义的 slice 就像索引。可以用 slice 对象作为 valarray 对象的下标来选择两个或更多个元素。被选择的元素不需要是数组中的连续元素。slice 选择的数组元素可以作为引用,因此可以访问或改变这些元素的值。

从根本上说,slice 对象为从 valarray 选择的元素封装了一系列索引。可以将 3 个 size_t 类型的值传给 slice 构造函数来定义 slice 对象:

  • valarray 对象中的 start index (起始索引)指定了子集的第一个元素;
  • size 是子集中的元素个数;
  • stride (步进)是为从子集中得到下一个元素的 valarray 索引的增量;

构造函数的参数釆用描述的顺序,因此可以按如下方式定义 slice 对象:

slice my_slice {3, 4, 2}; // start index = 3, size = 4, stride = 2

这个对象指定了从索引 3 开始的 4 个元素,后续索引的增量为 2。也有构造函数,因此可以复制进行 slice 对象。默认的构造函数会将 start index、size 和 stride 全部设为 0,它的唯一目的是进行切片对象数组的创建。

可以调用 slice 对象的成员函数 start() 来得到它的 start index。slice 对象也有成员函数 size() 和 stride(),它们各自返回 size 和 stride。返回的 3 个值都是 size_t 类型。

通常,在使用 slice{start,size, stride} 对象作为 valarray 对象的下标时,可以选择索引值位置的元素:

start, start + stride, start + 2*stride,...start + (size - 1)*stride

图 1 用一个值从 1 到 15 的 valarray 对象进行了展示。



图 1 slice 对象选择的 valarray 中的元素子集

本文标题:C++ valarray获取(访问)对象方法详解

本文地址:https://www.hosteonscn.com/3076.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注