c++学习笔记——标准数组以及数组模板类

这篇博客介绍了C++中动态内存管理的概念,包括指针声明、动态数组的创建与释放。同时,对比了标准数组、模板类vector和array的使用及区别。标准数组在编译时设定长度,动态内存分配则在运行时完成。vector提供动态调整大小的功能,而array与标准数组类似但更安全。文章强调了超出数组范围的赋值操作可能带来的安全隐患,并给出了C++代码示例。
摘要由CSDN通过智能技术生成

1、指针和动态数组

指针声明并赋值:int a = 1; int* ptr = &a; 

                       int* ptr1 = new int; 为ptr1分配int 4bytes的内存

使用new进行动态联编:

int tacos[10]; 静态联编,数组长度在编译时设置;

int *ptr = new int [size];在运行时为数组分配空间。

delete [] ptr;

2、标准数组、模板数组vector、模板数组array的运用和区别?

标准数组:type_name name[size];可以以标准括号方式进行访问、操作和赋值,存储数据分配的内存为静态内存栈,需要在编译的时候就指定数组长度,即数组长度固定。

vector数组:vector<type_name> name(size);可以以标准括号索引方式访问操作数据元素,为动态内存分配,即自由存储区堆内存。在运行的时候确定数组长度,可以动态改变数组的长度,采用new delete进行内存分配和管理,效率稍低。

array数组:与标准数组相同,数组长度固定,在编译时指定,使用栈进行静态内存分配,效率与标准数组相同,但更安全方便。相同类型和长度的array可以进行相互赋值,直接进行,而不用逐元素赋值。

示例如下,使用模板类时需包含头文件。

#include <iostream>
#include <vector>
#include <array>

using namesapce std;

int main{
    // 标准数组
    int ar1[3] = {1, 2, 3};
    // vector数组
    vector<int> ar2(3) = {4, 5, 6};
    // array数组
    array<int, 3> ar3;
    ar3[0] = 7;
    ar3[1] = 8;
    ar3[2] = 9;
    // array 赋值
    array<int, 3> ar4;
    ar4 = ar3; 

    ar1[-3] = 12;
	cout << ar1[-3] << " ar1[-3] at " << &ar1[-3] << endl;
	cout << ar3[2] << &ar3[2] << endl;
	cout << ar4[2] << &ar4[2] << endl;
}

特殊索引赋值:在c++中,超出数组索引范围的赋值语句相当于指针的移位赋值操作,如例子中ar1[-3] = 12;相当于*(ar1 - 3) = 12;这种操作十分不安全,可能对内存中其它重要的内存块产生影响。这与python中的赋值索引大不相同,python中赋值索引代表着数组中倒序的位置,如a[-1]表示数组a中的末尾元素。

C++数组模板封装,主要成员包括: public: Array(); Array(int size); Array(int size, T value); Array(Array<T> & other); Array(T * arr, int size); Array(int size, T* arr, int arrSize); template <typename T2> Array(Array<T2> & other); template <typename T2> Array(T2 * arr, int size); template <typename T2> Array(int size, T2 * arr, int arrSize); ~Array(void); inline int Size(); // 返回元素的个数 inline int MemorySize(); // 返回实际占用内存的字节数 inline void ReSize(int size); // 重新设定大小,清除所有的数据 inline T * Buffer(); // 获取内部数组的首地址 inline void SetValue(int index, T val); // 设置第index个数据的值 inline T GetValue(int index); // 获得第index个数据 T SquareOfNorm2(); // 2范式的平方 T SquareOfDistance(Array<T> & another); // 距离另一个数组的距离的平方 T Distance(Array<T> & another); // 计算两个数组的距离 Array<T> Cut(int start, int len); // 从向量中截取一部分成为新的向量 Array<T> Cut(int start); // 将数组剪切一部分,返回新的数组,从start开始,一直到结束 T Norm0(); // 0范式,即求非0元素个数 T Norm1(); // 1范式,即求所有元素的和 T Norm2(); // 2范式,即求所有元素的平方和开根号 T Norm(int p = 2); // p范式 T Sum(); // 所有元素的和 void SetSmallValueToZero(); // 将绝对值小于eps的数值设置为0 T AbsMin(); // 返回绝对值的最小值 T Min(); // 返回最小值 T AbsMax(); // 返回绝对值的最大值 T Max(); // 返回最大值 void Offset(T value); // 所有数据偏移value T Average(); // 获得所有数据的平均值 void AverageTo(T value = 0); // 将数据平均化到某个数值 T Variance(); // 返回方差 void GaussianWhiten(); // 高斯白化,使得数组平均值为0,方差为1 void AbsValues(); // 所有的元素取绝对值 bool InfinityCheck(T maxValue = 1E50); // 数据检查,看数组中是否有数据为无穷大 bool IsZero(); // 返回数据是否全部为0 void Clear(); // 将数据全部清0 void Normalization(); // 正规化,每个元素平方和为1 void SumAsOne(); // 是每个元素的和为1 void SetMinTo(T value); // 将小于value的元素全部设置为value void SetMaxTo(T value); // 将大于value的元素全部设置为value virtual void WriteToTextFile(string filename, bool append = false); virtual void WriteToTextFile(ofstream & o); virtual void ReadFromTextFile(string filename); virtual void ReadFromTextFile(ifstream & i); protected: inline void Init(int size); public: Array<T> & operator = (Array<T> & v); Array<T> & operator = (T value); T & operator[] (int index); template<typename T2> Array<T> & operator = (Array<T2> & v); template<typename T> friend ostream & operator << (ostream & out, Array<T> & vector); template<typename T> friend istream & operator >> (istream & in, Array<T> & vector);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值