首页 > 其他分享 >valarray

valarray

时间:2022-12-03 11:35:09浏览次数:38  
标签:count var1 var2 print var valarray

本文所有代码均使用头文件valarray和iostream,并定义print函数如下

template <typename T> void print(const valarray<T> &va){
	for(unsigned i = 0; i < va.size(); i++)
		cout << va[i] << ' ';
	cout << endl;
}

构造函数

默认构造函数

valarray();

构造一个空的valarray

用单个元素构造

valarray(val, n);

构造一个大小为n,每个元素都为val的valarray.例子:

valarray<int> var(1, 5);
print(var);

运行结果

1 1 1 1 1 

用数组等容器构造

valarray(first, n);

从数组等容器的first开始,向后选取n个元素构造成valarray.例子:

valarray<int> var(data, sizeof(data) / sizeof(int));
valarray<int> Var(data + 2, 4);
print(var), print(Var);

运行结果

2 0 0 6 10 11 13 
0 6 10 11 

注意数组大小,比如这样的代码:

int data[7] = {2, 0, 0, 6, 10, 11, 13};
valarray<int> var(data, 8);

运行以后可能随机获得一堆乱码或RE

套娃:用valarray构造valarray

可以用一个valarray的全部或部分构造另一个valarray,直接上例子:

int data[6] = {2, 10, 11, 12, 13, 28};
valarray<int> var1(data, 6);
valarray<int> var2(var1);
valarray<int> var3(var2[slice(0, 3, 2)]);
print(var2), print(var3);

运行结果

2 10 11 12 13 28
2 11 13

解释一下上面slice的意思. slice在头文件valarray的定义如下

slice(first, length, step);

三个参数表示起点、大小、跨度,获取从first开始每step步一个共length个下标,并应用(且只能应用)到valarray上

析构函数

~valarray()

调用每个元素的析构函数,复杂度与数值数组的大小成线性。

定义在局部的valarray在消亡时会自动调用析构函数,注意时间复杂度。

operator运算符

valarray重载了除了++和--以外的所有常见运算符,运算规则为对其中的数逐个执行运算符的操作.随便举个例子:

int data[5] = {1, 2, 3, 4, 5};		//  var1        var2
valarray<int> var1(data, 5);
valarray<int> var2(1, 5);		//  1 2 3 4 5   1 1 1 1 1
var2 += var1;				//  1 2 3 4 5   2 3 4 5 6
var2 -= 1;				//  1 2 3 4 5   1 2 3 4 5
var1 -= var2;				//  0 0 0 0 0   1 2 3 4 5
var1 *= 123456789;			//  0 0 0 0 0   1 2 3 4 5
var2 *= var1;				//  0 0 0 0 0   0 0 0 0 0
valarray<bool> cmp = var1 == var2;
if(cmp.min() == 1) cout << "equal";	//  output:equal
var1 = 1;				//  1 1 1 1 1   0 0 0 0 0

对两个valarray执行运算操作时,若长度不相等,则执行到较短者的末位为止,比如将上面代码的第2行改成

valarray<int> var1(data, 4);

仍然会输出

equal

注:注意两个valarray进行==运算时返回的是一个长度等于两个valarray中的较短者的长度,类型为bool的valarray.

应用函数

valarray.apply(func);

将函数func应用到valarray中的每一个成员.例子:

int div(int x){return x / 10;};
int main(){
	valarray<int> var = {10, 20, 30, 40, 50};
	valarray<int> var2 = var.apply(div);
	print(var2);
	return 0;
}

运行结果

1 2 3 4 5 

数学函数

valarray.max();
valarray.min();
valarray.sum();

字面意思,无需解释

求最小值函数在比较两个valarray是否相等时用到,见上面 operator运算符 一节

移动函数

循环移动

valarray.cshift(count);

将valarray向左循环移动count个位置,如果count为负数,则向右循环移动|count|个位置.例子:

valarray<int> var = {1, 2, 3, 4, 5, 6, 7, 8, 9};
var = var.cshift(2);
print(var);

运行结果

3 4 5 6 7 8 9 1 2 

位置偏移

valarray.shift(count);

将valarray向左循环移动count个位置,如果count为负数,则向右循环移动|count|个位置.例子:

valarray<int> var = {1, 2, 3, 4, 5, 6, 7, 8, 9};
var = var.shift(2);
print(var);

运行结果

3 4 5 6 7 8 9 0 0 

tip

cshift和shift函数对参数的值没有特殊要求.对于cshift函数,如果参数的绝对值大于valarray的长度,则执行结果相当于参数为count % len的执行结果;对于shift函数,如果参数的绝对值大于valarray的长度,则valarray的值全为0

尺寸函数

获取大小

valarray.size();

返回元素个数

更改大小

valarray.resize(count);

将valarray的大小重设为count,并将其中的元素全部更改为0.例子:

valarray<int> var = {1, 2, 3, 4, 5, 6, 7, 8, 9};
var.resize(5);
print(var);

运行结果

0 0 0 0 0 

交互函数

valarray1.swap(valarray2)

交换两个valarray.虽然下面的

swap(valarray1, valarray2);

也可以实现此功能,但是执行速度不如前者

标签:count,var1,var2,print,var,valarray
From: https://www.cnblogs.com/xj22yangyichen/p/16947209.html

相关文章