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