大佬教程收集整理的这篇文章主要介绍了C++ 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 超越序列容器的主要优势。
slice my_slice {3,2}; // start index = 3,size = 4,stride = 2这个对象指定了从索引 3 开始的 4 个元素,后续索引的增量为 2。也有构造函数,因此可以复制进行 slice 对象。默认的构造函数会将 start index、size 和 stride 全部设为 0,它的唯一目的是进行切片对象数组的创建。
start,start + stride,start + 2*stride,...start + (size - 1)*stride
图 1 用一个值从 1 到 15 的 valarray 对象进行了展示。valarray<int> data(15); std::iota(std::begin(data),std::end(data),1); size_t start {2},size {3},stride {5}; auto d_slice = data[slice {start,size,stride}];//References data[2],data[7],data[12] slice_array<int> copy_slice {d_slice}; // Duplicate of d_slice这里没有默认的构造函数,因此无法生成 slice_array 对象的数组。可以应用到 slice_array 对象的唯一操作是赋值和复合赋值。赋值运算符会将 slice_array 对象引用的全部元素设为给定值。也能够用它将被引用的元素设为另一个 valarray 对应元素的值,只要这个 valarray 与 slice_array 对象关联的 valarray 有相同的元素个数和类型。例如:
valarray<int> data {1,9,10,11,12,13,14,15}; valarray<int> more {2,6}; data[slice{0,1}] = 99; // Set elements in 1st row to 99 data [slice{10,1} ] = more; // Set elements in last row to values from more std::cout << "data:\n"; print(data,4);可以看到,能够很容易用 data[slice{0,5,1}] 这种表达式在赋值运算的左边生成 slice_airay。这里调用了 slice_array 的成员函数 operator=()。右操作数可以是一个单值元素,或是一个包含相同类型元素的 valarray,或是另一个同类型的 slice_array。将单值元素赋给 slice_array 会将 valarray 中的元素设置为它所引用的值。当右操作数是 valarray 或 slice_array 时,必须保证它至少包含和左操作数一样多的元素;如果元素没有那么多,得到的结果将不是我们想要的。执行上面的代码,输出是:
data:
99 99 99 99 99
6 7 8 9 10
2 2 3 3 3
valarray<int> data {1,5A 6,15}; auto d_slice = data [slice {2,5} ] ; // References data [2],data [7],data [12] d_slice += valarray<int>{10,20,30}; // Combines the slice with the new valarray std::cout << "data: \n"; print(data,4);对于 data 中被 d_slice 引用的元素,有更多的对象会被加到相应索引位置的元素值上。输出如下:
data:
1 2 13 4 5
6 7 28 9 10
11 12 43 14 15
valarray<int> factors {22,17,10}; data[slice{0,5}] *= factors; // Values of the 1st column: 22 102 110slice 对象会选择 data 中的第一列,这一列的每一个元素都会和 factor 对象中的相应元素相乘。如果只是想用分片乘以一个给定的值,可以只生成一个适当的 valarray 对象:
valarray<int> data {1,15}; slice row3 {10,1}; data[row3] *= valarray<int>(3,row3.size ()); // Multiply 3rd row of data by 3data 中的后 5 个元素会乘以 3。在最后一条语句中,通过调用 slice 对象的成员函数 size() 设置了右操作数 valarmy 中的元素个数。这保证了元素个数和 data 中被选择的元素个数是相同的。
valarray<int> data {1,15}; valarray<int> col5 {data[slice{4,5}]}; // Same as 5th column in data data[slice{1,5}] += col5; // Add to 2nd column data[slice{3,5}] += col5; // Add to 4th column print(data,4);以 slice 对象作为索引的 data 被作为参数对象传给 valarray 的构造函数,从而可以生成一个 slice_array 对象,它可以用来生成对象 col5。valarray 构造函数并不是被显式定义的,因此它可以将 slice_array 类型隐式转换为 valarray 类型。可以按如下方式定义 col5 对象:
valarray<int> col5 = data [slice{ 4,5} ] ; // Convert slice_array to valarray这里调用了 col5 对象的成员函数 operator=(),它需要一个 valarray 对象作为右操作数。编译器会为接受一个 slice_array 对象作为参数的 valarray 构造函数插入一个调用来将 slice_array 转换为 valarray。注意这和下面的语句并不相同:
auto col = data[slice{4,5}]; // col will be type slice_array这里并没有发生转换。只是将 col 定义为以 slice 对象为索引从 data 中得到的 slice_array 对象。
1 7 3 9 5
6 17 8 19 10
11 27 13 29 15
size_t row_len {5},n_rows {3}; // Row length,number of rows for(size_t i {}; i < n_rows*row_len; i += row_len) { data[i+1] += data[i+4]; // Increment 2nd column data[i+3] += data[i+4]; // Increment 4th column }循环索引 i 选择 data 中的第一列元素的索引值为步进。在循环体中使用 i+n 形式的表达式作为 data 的下标来从第 n 列选择元素。
以上是大佬教程为你收集整理的C++ valarray获取(访问)对象方法详解全部内容,希望文章能够帮你解决C++ valarray获取(访问)对象方法详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。