valarray
valarray类是由头文件valarray支持的。顾名思义,这个类用于处理数值(或具有类似特性的类),它支持诸如将数组中所有元素的值相加以及在数组中找出最大和最小的值等操作。valarray被定义为一个模板类,以便能够处理不同的数据类型。
特点及使用方法
valarray的接口定义如下:
template <typename T>
class valarray
{
public:
typedef T value_type;
// 构造和析构
valarray();
explicit valarray(size_t);
valarray(const T&, size_t);
valarray(const T*, size_t);
valarray(const valarray&);
valarray(const slice_array<T>&);
valarray(const gslice_array<T>&);
valarray(const mask_array<T>&);
valarray(const indirect_array<T>&);
~valarray();
// 赋值
valarray<T>& operator=(const valarray<T>&);
valarray<T>& operator=(const T&); // 赋给所有元素
valarray<T>& operator=(const slice_array<T>&);
valarray<T>& operator=(const gslice_array<T>&);
valarray<T>& operator=(const mask_array<T>&);
valarray<T>& operator=(const indirect_array<T>&);
// 下标访问
const T& operator[](size_t) const;
T& operator[](size_t);
valarray<T> operator[](slice) const;
slice_array<T> operator[](slice);
valarray<T> operator[](const gslice&) const;
gslice_array<T> operator[](const gslice&);
valarray<T> operator[](const valarray<bool>&) const;
mask_array<T> operator[](const valarray<bool>&);
valarray<T> operator[](const valarray<size_t>&) const;
indirect_array<T> operator[](const valarray<size_t>&);
// 运算符, 其他未列出
valarray<T>& operator*= (const T&);
valarray<T>& operator*= (const valarray<T>&);
// member functions
size_t size() const;
T sum() const;
T min() const;
T max() const;
void resize(size_t size, T c = T());
// 移位, 正数左移, 负数右移
valarray<T> shift (int) const;
valarray<T> cshift(int) const; // 循环移位
// 对所有元素执行func函数
valarray<T> apply (T func(T)) const;
valarray<T> apply (T func(const T&)) const;
private:
size_t _M_size;
T* _M_data;
};
另外,头文件valarray还将cmath里的大多部分数学函数都进行了重载,使之可应用于valarray。valarray直接调用operator new()来获取内存,用operator delete()释放内存,所以模板参数里并没有空间配置器。
从valarray接口定义中可以得出valarray的一些特点及使用方法:
模板特性意味着声明对象时,必须指定具体的数据类型。因此,使用valarray类来声明一个对象时,需要在标识符valarray后面加上一对尖括号,并在其中包含所需的数据类型。
valarray<int> q_values;
valarray<double> weights;
可以创建长度为零的空数组、指定长度的空数组、所有元素被初始化为指定值的数组、用常规数组中的值进行初始化的数组。在C++11中也可以使用初始化列表。
#include <iostream>
#include <valarray>
int main (void)
{
using std::valarray;
using std::cout;
using std::endl;
double gpa[5] = {3.1, 3.5, 3.8, 2.9, 3.3};
valarray<double> v1;//长度为0的空数组
valarray<int> v2;//长度为8的空数组(数组元素未初始化)
valarray<int> v3(10, 8);//长度为8,数组元素均被初始化为10
valarray<double> v4(gpa, 4);//长度为4,每一个数组元素都是一个gpa数组,但v4与二维数组不同
cout << v4[1] << " " << v4[2] << endl;
valarray<int> v5 = {20, 32, 17, 9};
return 0;
}
一段源代码介绍valarray最常用的几种用法
#include <iostream>
#include <valarray>
int main (void)
{
using std::valarray;
using std::cout;
using std::endl;
valarray<int> v = {-1, -8, 0, 20, 32, 17, 9};
cout << "数组元素:" << v[0] << " " << v[1] << " " << v[2] << " " << v[3] << " " << v[4] << " " << v[5] << " " << v[6] << endl;
cout << "长度:" << v.size() << endl;
cout << "最大值:&