#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;
}