valarray数组运算

valarray

  1. apply 将 valarray 数组的每一个值都用 apply 所接受到的函数进行计算

  2. cshift 将 valarray 数组的数据进行循环移动,参数为正者左移为负就右移

  3. max 返回 valarray 数组的最大值

  4. min 返回 valarray 数组的最小值

  5. resize 重新设置 valarray 数组大小,并对其进行初始化

  6. shift 将 valarray 数组移动,参数为正者左移,为负者右移,移动后由 0 填充剩余位

  7. size 得到数组的大小

  8. 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);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值