STL算法库-数字运算(二)

三、数组(向量)运算
STL提供了一个数组类valarray,用于实现数值数组的运算,其代表数值线性序列。
3.1 头文件
#include<valarray>
3.2 构造函数
valarray();
explicite valarray(size_t n);
valarray(const T& val,size_t n);
valarray(const T* P,size_t n);
valarray(const slice_array<T>& sa);
valarray(const gslice_array<T>& ga);
valarray(const mask_array<T>& ma);
valarray(const inderect_array<T>& ia);

示例代码:

#include "stdafx.h"
#include "valarray"
#include "iostream"
using namespace std;

void print(const valarray<int>& varray)
{
 for(int i=0;i<varray.size();i++)
  cout<<varray[i]<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,3,4,5,6,7,8,9};
 valarray<int> vall(10);
 valarray<int> val2(0,10);
 valarray<int> val3(dim,sizeof(dim)/sizeof(int));
 valarray<int> val4(val2);
 cout<<"valarray val1: "<<endl;
 print(vall);
 cout<<endl;
 cout<<"valarray val2:"<<endl;
 print(val2);
 cout<<endl;
 cout<<"valarray val3"<<endl;
 print(val3);
 cout<<endl;
 cout<<"valarray val4"<<endl;
 print(val4);
 cout<<endl;
 return 0;
}

3.3 下标、赋值以及数学运算
[]下标操作支持访问数组中每个元素
+、-、*、/等数学运算,如valarray1*valarray2表示对应的元素相乘

3.4 成员函数
size();获取数组的大小
max();获取数组中的最大值
min();获取数组中的最小值
sum();获取数组中所有元素的总和
resize();重新设置数组的大小
shift();实现逻辑移位,将数组中元素位置顺序移动
cshift();实现循环移位
apply():
valarray<T> apply(T fn(T)) const;
valarray<T> apply(T fn(const T&)) const;
函数apply()的功能是使用函数fn处理数组中的每个元素,并返回新的valarray
free()删除数组中所有的元素,将数组的长度置为0

示例代码:
#include "stdafx.h"
#include "iostream"
#include "valarray"

using namespace std;

void print(const valarray<int>& array)
{
 int size = array.size();
 for(int i=0;i<size;i++)
 {
  cout<<array[i]<<" ";
 }
 cout<<endl;
}

int fn(int ele)
{
 int r = 0;
 r = ele * 2;
 return r;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,-3,4,5,6,-7,8,9};
 valarray<int> val1(10);
 valarray<int> val2(-1,10);
 valarray<int> val3(dim,sizeof(dim)/sizeof(int));
 valarray<int> val4(val2);
 valarray<int> val5;
 cout<<"valarray val1:"<<endl;
 print(val1);
 cout<<"valarray val2:"<<endl;
 print(val2);
 cout<<"valarray val3:"<<endl;
 print(val3);
 cout<<"valarray val4:"<<endl;
 print(val4);
 val5 = abs(val3);
 cout<<"abs(val3)=:"<<endl;
 print(val5);
 int s = val3.size();
 int ma = val3.max();
 int mi = val3.min();
 cout<<"the size of val3 is:"<<s<<endl;
 cout<<"the max number of val3 is:"<<ma<<endl;
 cout<<"the min number of val3 is:"<<mi<<endl;
 val3.resize(15);
 cout<<"val3 is resized,val3 is:"<<endl;
 print(val3);
 int he = val3.sum();
 cout<<"the sum of val3 is"<<he<<endl;
 val3 = val5.shift(-5);
 cout<<"val5 move 5 bits left"<<endl;
 print(val3);
 val3 = val5.shift(5);
 cout<<"val5 move 5 bits right"<<endl;
 print(val3);
 val3 = val5.cshift(-5);
 cout<<"val5 move 5 bits left circulatedly"<<endl;
 print(val3);
 val3 = val5.cshift(5);
 cout<<"val5 move 5 bits right circulatedly"<<endl;
 print(val3);

 val3 = val5.apply(&fn);
 cout<<"val5 which has been delt by fn is below:"<<endl;
 print(val3);
 val1.free();
 val2.free();
 val3.free();
 val4.free();
 val5.free();
 return 0;
}

3.5 超越函数
头文件:#include "cmath"
3.5.1 获取每个元素的绝对值
valarray<T> abs(const valarray<T>& x);
3.5.2 对每个元素求幂
valarray<T> pow(const valarray<T>& x,const valarra<T>& y);
valarray<T> pow(const valarray<T>& x,const T& y);
valarray<T> pow(const T& x,const valarray<T>& y);
3.5.3 对每个元素求以自然数e为底的对数
valarray<T> exp(const valarray<T>& x);
3.5.4 求每个元素的平方根
valarray<T> sqrt(const valarray<T>& x);
3.5.5 求每个元素以自然数为底的对数
valarray<T> log(const valarray<T>& x);
3.5.6 求每个元素以10为底的对数
valarray<T> log10(const valarray<T>& x);
3.6.7 三角函数
valarray<T> sin(const valarray<T>& x);
valarray<T> cos(const valarray<T>& x);
valarray<T> tan(const valarray<T>& x);
valarray<T> sinh(const valarray<T>& x);
valarray<T> cosh(const valarray<T>& x);
valarray<T> tanh(const valarray<T>& x);
valarray<T> asin(const valarray<T>& x);
valarray<T> acos(const valarray<T>& x);
valarray<T> atan(const valarray<T>& x);
valarray<T> atan2(const valarray<T>& x,const T& y);
valarray<T> atan2(const T& x,const valarray<T>& y);

3.6 数组子集类-slice类和类模板slice_array

slice是切割的意思,其主要三元素:起始下标、元素个数、元素的间距,在一个valarray中,中间距为n的多个元素,slice的跨步是且各种两个元素的距离
示例代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
 valarray<double> v1(12),v2;
 for (int i=0;i<12;i++)
 {
  v1[i]=2*(i+1);
 }
 cout<<"v1(original):"<<endl;
 myPrint(v1);
 valarray<double> tv1 = valarray<double>(v1[slice(0,4,3)]);
 valarray<double> tv2 = valarray<double>(v1[slice(2,4,3)]);
 cout<<"tv1: "<<endl;
 myPrint(tv1);
 cout<<"tv2: "<<endl;
 myPrint(tv2);
 v1[slice(0,4,3)]=pow(tv1,tv2);
 cout<<"v1(calculated):"<<endl;
 myPrint(v1);
 valarray<double> v3(v1[slice(0,4,3)]);
 cout<<"v3: "<<endl;
 myPrint(v3);
 return 0;
}

3.7 类gslice和类模板gslice_array
gslice和slice区别:gslice能够运用数组来定义大小和间距,除此以外两者相同,gslice也具有三个元素:三个属性:其实索引、元素数量、元素间距
如,有一valarray类型的数组valarray<int> v1[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},用gslice产生子集的三种方式
产生一维数组,和slice一样:
v1[gslice(2,4,3)]返回子集{2,5,8,11};
产生二维数组:

产生三维数组:

3.8 类mask_array
mask_array是一组元素为bool值的数组,提取valarray中的元素时,保留值为true的对应元素,不保留值为false的对应的元素

示例代码如下:
#include "stdafx.h"
#include "iostream"
#include "valarray"
using namespace std;


void myprint(valarray<double>& v)
{
 int size=v.size();
 for (int i=0;i<size;i++)
 {
  cout<<v[i]<<", ";
 }
 cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
 double dim[12]={1,2,3,4,5,6,7,8,9,10,11,12};
 valarray<double> v1(dim,sizeof(dim)/sizeof(double)),v2,v3;
 cout<<"valarray(original) v1:"<<endl;
 myprint(v1);
 bool B[]={0,1,0,1,0,0,1,1,1};
 valarray<bool> mask_array(B,9);
 v2=v1[mask_array];
 cout<<"mask_array v2:"<<endl;
 myprint(v2);
 return 0;
}

3.9 间接数组
构建新的valarray时,作为参数的valarray提供元素索引。
示例代码如下:
#include "stdafx.h"
#include "iostream"
#include "valarray"
using namespace std;


void myprint(valarray<double>& v)
{
 int size=v.size();
 for (int i=0;i<size;i++)
 {
  cout<<v[i]<<", ";
 }
 cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
 double dim[12]={1,2,3,4,5,6,7,8,9,10,11,12};
 valarray<double> v1(dim,sizeof(dim)/sizeof(double)),v2,v3;
 cout<<"valarray(original) v1:"<<endl;
 myprint(v1);
 valarray<size_t> vi(4);
 vi[0]=4;
 vi[1]=6;
 vi[2]=7;
 vi[3]=1;
 v2=v1[vi];
 cout<<"valarray v2(indirect_array): "<<endl;
 myprint(v2);
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值