C++的三个数组模板类

本文介绍了C++中的三个数组模板类:valarray、vector和array。valarray适用于数值计算,具有数学运算接口;vector作为容器类,功能丰富,支持STL操作;array则提供安全、高效的固定长度数组操作。每个模板类有其特定应用场景,如valarray在数学编程,vector在通用存储,array在高效数组操作。
摘要由CSDN通过智能技术生成


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里的大多部分数学函数都进行了重载,使之可应用于valarrayvalarray直接调用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 << "最大值:&
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现有两个类 CVector 存放数据的自定义动态数组,采用一维动态数组存储矩阵数据 CMatrix 实现的矩阵类 使用的时候包含#include "Matrix.h"就行 CMatrix的接口函数都在"Matrix.h"里面 CVector的接口函数在"Vector.h"里,"Matrix.h"里包含了"Vector.h" 具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0) 2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能作加减 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由CVector初始化。 3、定义了一个最大允许误差#define permit_eof (1.0e-13),判断相等使用宏 #define EQUAL(a,b) ( ((b) - (a) < permit_eof)&&((a) - (b) < permit_eof) ? (TRUE) : (FALSE) ) 正常输出的时候绝对值小于permit_eof 的时候清零处理,想要指定精度输出请用PrintOut 鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区分了函数返回值的左右值 =================================================附录:接口函数========================================================================== 开放的接口: CVector //构造函数 CVector(); virtual ~CVector(); CVector(const size_t &nSize;); CVector(const CVector & vIn);//拷贝构造函数 CVector(const double* const pData,const size_t &nSize;); CVector(const float* const pData,const size_t &nSize;); CVector(const int* const pData,const size_t &nSize;); //公开的成员函数 double at(const size_t& uIndex)const;//作右值 BOOL push_back(const double& dbIn ); BOOL resize(const size_t& nSize); size_t size()const; //重载操作符 double& operator()(const UINT& uIndex);//重载()运算符,可作左值 //重载的运算符 double& operator()(const size_t& xr,const size_t& xc);//重载()运算符,可作左值 CVector& operator=(const CVector &);//重载=运算符 double operator*(const CVector & )const;//重载*运算符,两向量相乘 CVector operator*(const double α)const;//重载*运算符,向量乘以实数alpha CVector& operator*=(const double α);//重载*=算符,向量乘以实数alpha CVector operator+(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator+=(const CVector & );//重载+=算符,向量加上向量 CVector operator-(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator-=(const CVector & );//重载+=算符,向量加上向量 CVector operator+(const double α)const;//重载+运算符,向量加上实数alpna CVector& operator+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值