valarray
-
apply 将 valarray 数组的每一个值都用 apply 所接受到的函数进行计算
-
cshift 将 valarray 数组的数据进行循环移动,参数为正者左移为负就右移
-
max 返回 valarray 数组的最大值
-
min 返回 valarray 数组的最小值
-
resize 重新设置 valarray 数组大小,并对其进行初始化
-
shift 将 valarray 数组移动,参数为正者左移,为负者右移,移动后由 0 填充剩余位
-
size 得到数组的大小
-
sum 数组求和
#include<iostream>
#include<ctime>
#include<algorithm>
#include<vector>
#include<valarray>
#include<cmath>
using namespace std;
void print(valarray<int>& array) {
for (int i = 0; i < array.size(); i++) {
cout << array[i] << " ";
}
cout << endl;
}
int fn(int ele) {
return(2 * ele - 1);
}
int main() {
#pragma region valarray构造函数
//int dim[] = { 1,2,3,4,5,6,7,8,9 };
//valarray<int>val1(10);//长度为10
//valarray<int>val2(1,10);
//valarray<int>val3(dim, sizeof(dim) / sizeof(int));
//valarray<int>val4(val2);
//cout << "val1" << endl;
//print(val1);
//cout << "val2" << endl;
//print(val2);
//cout << "val3" << endl;
//print(val3);
//cout << "val4" << endl;
//print(val4);
#pragma endregion
#pragma region valarray具体运算操作
//valarray<int>val5(2,10);
//valarray<int>array;
//val4 = val2 + val5;//实现每个元素对应相加,还可以是+、-、*、/、模数、反向、位操作、位比较、逻辑操作、赋值操作等
//cout << "val4" << endl;
//print(val4);
//cout << "val3最大值" << " " << val3.max() << endl;
//cout << "val3最小值" << " " << val3.min() << endl;
//cout << "val3尺寸" << " " << val3.size() << endl;
//cout << "val3求和" << " " << val3.sum() << endl;
//cout << "val3移位" << " " ;
//array = val3.shift(3);
//print(array);
//cout << "val3循环移位" << " ";
//array = val3.cshift(3);
//print(array);
//cout << "val3apply的函数" << " ";
//array = val3.apply(&fn);
//print(array);
abs(),pow,exp,sqrt,log,log10,sin,cos,tan,sinh,cosh,tanh,asin,acos,atan,atan2
//cout << "pow(val3)" << endl;
//array = pow(val3, 2);
//print(array);
//cout << "pow(val3,val4)" << endl;
//array = pow(val3, val4);
//print(array);
//valarray<valarray<int>>val6(3);
//cout << "测试二维数组" << endl;
//for (int i = 0; i < 3; i++) {
// val6[i] = val3.apply(&fn);
// print(val6[i]);
//}
val3.resize(val2.size());//重新定义大小,会将其原来的值全部覆盖变为0
#pragma endregion
#pragma region slice与glice
//valarray<int>var;
//var = val3[slice(0, 4, 2)];//slice(起始下标,元素个数,元素间距) 从0开始,每间隔2,返回满足条件的前4个数
//cout << "slice:" << endl;
//print(var);
//valarray<int>var1(20);
//for (int i = 0; i < 20; i++) {
// var1[i] = i + 1;
//}
//valarray<size_t>len(5, 1);//共5个数据
//valarray<size_t>str(3, 1);//间距为3
//var = var1[gslice(1, len, str)];//起点索引1 最终是按照行展平的数据
//cout << "一维gslice:" << endl;
//print(var);
//size_t length2[] = { 3,2 };//3行2列
//size_t stride2[] = { 5,4 };//行间距为4,列间距为5
//valarray<size_t>len2(length2, 2);
//valarray<size_t>str2(stride2, 2);
//var = var1[gslice(0, len2, str2)];//起点索引0 最终是按照行展平的数据
//cout << "二维gslice:" << endl;
//print(var);
//size_t length3[] = { 4,2,3};//4个2行3列的数据块
//size_t stride3[] = { 1,2,3};//每个块间间隔1,块内行间距2,列间距3
//valarray<size_t>len3(length3, 3);
//valarray<size_t>str3(stride3, 3);
//var = var1[gslice(0, len3, str3)];//起点索引0 最终数据按照行展平
//cout << "三维gslice:" << endl;
//print(var);
glice与slice的区别在于glice能够运用数组定义大小和间距,除此之外,别无区别
#pragma endregion
#pragma region 屏蔽子集mask
//valarray<int>v1(12);
//for (int i = 0; i < 12; i++) {
// v1[i] = i + 1;
//}
//valarray<int>v2;
//bool B[] = { 1,0,1,1,0,1,1,1,1,0,0,1 };
//valarray<bool>mask_array(B,12);
//v2 = v1[mask_array];//对应位置取值
//print(v1);
//print(v2);
//v2=v1[v1 > 5];//取v1中大于5的数,
//print(v2);
//v2 = valarray<int>(v1[v1 < 5]) * 10;//取v1中小于5的数,并扩大10倍,不能这样v1[v1 < 5]*10
//print(v2);
//v2 = v1[!mask_array];//取反
//print(v2);
//valarray<bool>index;
//index = v1 > 5;//返回的是bool型数据
//for (int i = 0; i < index.size(); i++) {
// cout << index[i] << " ";
//}
//cout << endl;
#pragma endregion
#pragma region indirect_array应用
valarray<int>v1(12),v2;
for (int i = 0; i < 12; i++) {
v1[i] = i + 1;
}
print(v1);
valarray<size_t>vi(4);
vi[0] = 2;
vi[1] = 5;
vi[2] = 6;
vi[3] = 9;
v2 = v1[vi];
print(v2);
#pragma endregion
return(0);
}