当前课程知识点:C++语言程序设计进阶 > 第九章 模板与群体数据 > 数组 > 数组类模板
静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。
缺点:大小在编译时就已经确定,在运行时无法修改。
动态数组由一系列位置连续的,任意数量相同类型的元素组成。
优点:其元素个数可在程序运行时改变。
vector就是用类模板实现的动态数组。
#ifndef ARRAY_H #define ARRAY_H #include <cassert> template <class T> //数组类模板定义 class Array { private: T* list; //用于存放动态分配的数组内存首地址 int size; //数组大小(元素个数) public: Array(int sz = 50); //构造函数 Array(const Array<T> &a); //复制构造函数 ~Array(); //析构函数 Array<T> & operator = (const Array<T> &rhs); //重载"=“ T & operator [] (int i); //重载"[]” const T & operator [] (int i) const; //重载"[]”常函数 operator T * (); //重载到T*类型的转换 operator const T * () const; int getSize() const; //取数组的大小 void resize(int sz); //修改数组的大小 }; template <class T> Array<T>::Array(int sz) {//构造函数 assert(sz >= 0);//sz为数组大小(元素个数),应当非负 size = sz; // 将元素个数赋值给变量size list = new T [size]; //动态分配size个T类型的元素空间 } template <class T> Array<T>::~Array() { //析构函数 delete [] list; } template <class T> Array<T>::Array(const Array<T> &a) { //复制构造函数 size = a.size; //从对象x取得数组大小,并赋值给当前对象的成员 list = new T[size]; // 动态分配n个T类型的元素空间 for (int i = 0; i < size; i++) //从对象X复制数组元素到本对象 list[i] = a.list[i]; }
如果一个函数的返回值是一个对象的值,就是右值,不能成为左值。
如果返回值为引用。由于引用是对象的别名,通过引用可以改变对象的值,因此是左值。
//续上,重载"="运算符,将对象rhs赋值给本对象。实现对象之间的整体赋值 template <class T> Array<T> &Array<T>::operator = (const Array<T>& rhs) { if (&rhs != this) { //如果本对象中数组大小与rhs不同,则删除数组原有内存,然后重新分配 if (size != rhs.size) { delete [] list; //删除数组原有内存 size = rhs.size; //设置本对象的数组大小 list = new T[size]; //重新分配size个元素的内存 } //从对象X复制数组元素到本对象 for (int i = 0; i < size; i++) list[i] = rhs.list[i]; } return *this; //返回当前对象的引用 } //重载下标运算符,实现与普通数组一样通过下标访问元素,具有越界检查功能 template <class T> T &Array<T>::operator[] (int n) { assert(n >= 0 && n < size); //检查下标是否越界 return list[n]; //返回下标为n的数组元素 } template <class T> const T &Array<T>::operator[] (int n) const { assert(n >= 0 && n < size); //检查下标是否越界 return list[n]; //返回下标为n的数组元素 //重载指针转换运算符,将Array类的对象名转换为T类型的指针 template <class T> Array<T>::operator T * () { return list; //返回当前对象中私有数组的首地址 } //取当前数组的大小 template <class T> int Array<T>::getSize() const { return size; } // 将数组大小修改为sz template <class T> void Array<T>::resize(int sz) { assert(sz >= 0); //检查sz是否非负 if (sz == size) //如果指定的大小与原有大小一样,什么也不做 return; T* newList = new T [sz]; //申请新的数组内存 int n = (sz < size) ? sz : size;//将sz与size中较小的一个赋值给n //将原有数组中前n个元素复制到新数组中 for (int i = 0; i < n; i++) newList[i] = list[i]; delete[] list; //删除原数组 list = newList; // 使list指向新数组 size = sz; //更新size } #endif //ARRAY_H
#include <iostream> using namespace std; void read(int *p, int n) { for (int i = 0; i < n; i++) cin >> p[i]; } int main() { int a[10]; read(a, 10); return 0; } #include "Array.h" #include <iostream> using namespace std; void read(int *p, int n) { for (int i = 0; i < n; i++) cin >> p[i]; } int main() { Array<int> a(10); read(a, 10); return 0; }
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义