valarray类常见操作

#include <iostream>
#include <valarray>
#include <cstdlib>
#include <cmath>

using namespace std;

/*
valarray是一个数值计算类,主要用于处理数值数组
使用valarray需引入valarray头文件
valarray处于std名称空间中
valarray是一个模板类,需要指定类型
*/


// valarray类数据的打印输出
template <typename T>
void show(valarray<T> valarr){
	for(T temp : valarr)
		cout << temp << " ";
	cout << endl;
	// 也可以用传统的for循环,可以使用valarr.size()获取“数组”的长度
	/*
	for(int i=0;i<valarr.size();i++)
		cout << valarr[ib] << " ";
	cout << endl;
	*/
}

// 对x取反,用于测试apply成员函数
int fun1(int x){
	return x>0 ? 0-x : abs(x);	
}

int main(){
	/******************** 初始化 ********************/
	
	// 初始化方式1,创建一个长度为3的int“数组”,默认填充0
	valarray<int> valarr1(3);
	show(valarr1);	// 输出:0 0 0
	
	// 初始化方式2,创建一个长度为5的double“数组”,默认以2.0填充
	valarray<double> valarr2(2.0, 5);
	show(valarr2);	// 输出2 2 2 2 2
	
	// 初始化方式3,使用已有的数组进行填充,char也是数值类型
	// 注:"Hello world!"代表数组指针,7代表创建的“数组”长度,也即截取长度
	valarray<char> valarr3("Hello world!", 7);
	show(valarr3);	// 输出:H e l l o   w
	
	// 列表初始化方式
	valarray<double> valarr4{1.0, 3.0, 5.0, 7.0};
	show(valarr4);	// 输出:1 3 5 7
	
	// 批量初始化
	valarray<int> valarr5(6);
	// 将所有元素初始化为10
	valarr5 = 10;	
	show(valarr5);	// 输出:10 10 10 10 10 10
	
	
	/******************** 数据操作 ********************/
	
	// 创建一个长度为0的空“数组”
	valarray<double> valarr6;
	// 修改valarr6长度为6,默认使用0填充
	valarr6.resize(5);	
	show(valarr6);	// 0 0 0 0 0
	// 修改valarr6长度为3,并用1.6填充
	// resize操作相当于重新创建了一个“数组”,原来的数据清空
	valarr6.resize(3,1.6);	
	show(valarr6);	// 1.6 1.6 1.6
	
	// 对数据批量+操作,相当于for遍历每个元素并+1.5
	// -= *= /= %=等常见操作均适用
	valarr6 += 1.5;
	show(valarr6);	// 3.1 3.1 3.1
	
	valarray<int> valarr7{1, -3, 5, -7};
	// 使用fun1函数对valarr7中的每个元素进行取反操作,返回一个新的valarray对象
	// apply入参只支持函数名或者函数的引用,不支持lambda表达式
	// valarr7.apply([](double x){return x>0 ? 0-x : abs(x);});
	valarray<int> valarr8 = valarr7.apply(fun1);
	show(valarr8);	// -1 3 -5 7
	
	// 找最大值最小值及求和
	cout << "最大值:" << valarr8.max() << endl; 	// 最大值:7
	cout << "最小值:" << valarr8.min() << endl; 	// 最小值:-5
	cout << "求和:" << valarr8.sum() << endl; 	//求和 :4
	
	// valarr4{1.0, 3.0, 5.0, 7.0}  valarr6{3.1, 3.1, 3.1}
	// 两个valarray对象间的加减乘除
	// 以第一个对象为基准,对相同位置的元素执行加/减/乘/除操作并返回新的valarray对象
	valarray<double> valarr9 = valarr4 + valarr6;
	show(valarr9);	// 4.1 6.1 8.1 7
	valarray<double> valarr10 = valarr6 + valarr4;
	show(valarr10);	// 4.1 6.1 8.1
	valarray<double> valarr11 = sqrt(valarr10);	// 对每个元素开平方的操作
	show(valarr11);	// 2.02485 2.46982 2.84605
	
	return 0;
}

  

posted @ 2024-09-03 10:20  我信你个鬼!  阅读(6)  评论(0编辑  收藏  举报