数组运算(向量)
头文件: <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
三角函数:
等等