三、数组(向量)运算
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);
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
示例代码:
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的跨步是且各种两个元素的距离
示例代码如下:
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的对应的元素
示例代码如下:
3.9 间接数组
构建新的valarray时,作为参数的valarray提供元素索引。
示例代码如下:
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;
}