六、STL的数值计算---向量(数组)运算--valarray类

数组运算(向量)

头文件: <valarray>
stl提供了一个数组类: class valarray
1. valarray 实现数值数组的运算
2. valarray代表: 数值线性队列,该序列是一维的

1.类valarray

valarray是经过优化的向量(vector),有四个辅助类型

  • slice_array
  • gslice_array
  • mask_array
  • indirect_array

这四个辅助类型用于存放临时数值或数据。

1.构造函数

valarray();(1)

explicit valarray( size_t count );(2)

valarray( const T& val, size_t count );(3)  

valarray( const T* vals, size_t count );(4) 

valarray( const valarray& other );(5)

valarray( valarray&& other );(6)    (C++11 起)

valarray( const std::slice_array<T>& );(7)

valarray( const std::gslice_array<T>& );(8) 

valarray( const std::mask_array<T>& );(9)

valarray( const std::indirect_array<T>& );(10)  

说明:
1. 构造此对象,最简单的形式:将元素的数量作为参数,即(2),(3),size_t作为数组的大小,val作为初始 默认值。
2. 第四种(4):可以使用已知数组对valarray初始化

例子:

//--------------省略-----------------

int dim[] = {1,2,3,4,5,6};
valarray<int> val_1(6);//第二种
valarray<int> val_2(0,6);//第三种
valarray<int>val_3(dim,sizeof(dim)/sizeof(int));//第四种
valarray<int>val_4(val_1);//第五种
//--------------省略-----------------

2.下标、赋值和数学运算

元素访问:

  • operator[]

赋值操作:

  • operator=

空间容量:

  • size :返回valarray的大小
  • resize : 改变valarray的大小

普通运算:
+、-、* 、模数,反向,相运算,位操作,位比较,逻辑操作,赋值操作等;

3. 成员函数

一系列成员函数:

  • sum() : 计算所有元素的和
  • max() : 获取最大的元素
  • min() : 获得最小的元素
  • shift() : 以零填充的方式移动valarray元素
  • cshift() : 循环移动valarray元素
      函数原型;
//每个元素的新位置是i−count,i是以前的位置
valarray<T> shift( int count ) const;
//循环移位
valarray<T> cshift( int count ) const;
  • apply() : 将函数应用于每个valarray元素
valarray<T> apply( T func(T) ) const;
valarray<T> apply( T func(const T&) ) const;
  • free() : 删除数组所有元素,并将数组长度设置为0
    例子:
void printItem(int elem){
    cout << elem << "   ";
}
//-------------省略-------------
valarray<int> val_1 = {1,2,3,4,5,6,7};
cout << "sum: " << val_1.sum() << endl;
cout << "max: " << val_1.max() << endl;
cout << "min: " << val_1.min() << endl;

//shift 和cshift
valarray<int>  val_2 = val_1.shift(3);
copy(begin(val_2), end(val_2), ostream_iterator<int>(cout, " "));
cout << endl;

cout << "cshift 3: ";
valarray<int>  val_3 = val_1.cshift(3);
copy(begin(val_3), end(val_3), ostream_iterator<int>(cout, " "));   cout << endl;

// apply:
cout << "apply : ";
for_each(begin(val_1), end(val_1), printItem);
cout << endl;

//free
val_1.free();
cout << "size after free: " << val_1.size() << endl;
//-------------省略-------------

输出结果为:

sum: 28
max: 7
min: 1
shift 3: 4 5 6 7 0 0 0
cshift 3: 4 5 6 7 1 2 3
apply : 1   2   3   4   5   6   7
size after free: 0

4. 超越函数

都是非成员函数,因此在使用下面的有些运算函数,需要包含头文件<cmath>

  • std::swap(std::valarray) (C++11) :特化 std::swap() 算法
  • std::begin(std::valarray) (C++11) :特化的 std::begin
  • std::end(std::valarray) (C++11) :特化的 std::end
  • abs(std::valarray) 在valarray的每个元素上调用std::abs函数

指数函数:
- exp
- log
- log10

幂函数:
- pow
- sqrt

三角函数:
等等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值