学习书籍:数据结构(C++语言版) 邓俊辉
环境:Win10 VS2017
注意事项:
1.模板类成员函数的声明和定义都放在头文件中。
2.头文件中尽可能不使用using namespace std;
引入名称空间类似操作。
代码会与邓俊辉老师的有略微不同之处,自己去写总会踩到一些C++语言的坑,同时当做C++的学习,代码都是检查过可运行的,可以直接使用,若存在BUG请及时指正错误。
在定义数组的时候必须指定数组的大小,但有时我们并不知道需要一个多大的数组,如果准备的空间比我们所需要的大就会造成浪费,如果小则空间不足。所以我们需要一个动态数组,而C++是面向对象的语言,所以我们可以把动态数组及其常用操作封装成一个类,只向外提供接口,这就是要学习的向量类——Vector。
为了让我们制作的Vector可以反复的,多情况下进行使用,我们把Vector类做成一个模板类。
首先定义这个Vector模板类
其中重点声明:lo与hi的含义
lo:首元素的秩(位置)
hi:尾元素后一个的秩序
例如1 2 3 4中若lo为1的秩,hi即为4之后元素的位置,hi为一哨兵
具体示意如下:
/*元素的秩 即元素位置*/
typedef int Rank; //using Rank = int;
#define DEFALUT_CAPACITY 6 //constexpr int DEFALUT_CAPACITY=6 向量默认初始容量
/*
该类基本的成员
包括成员变量 以及构造函数,拷贝构造函数等
*/
template <class T>
class Vector
{
protected:
Rank _size; //规模
int capacity; //容量
T* elem; //数据区 即封装起来的动态数组
void copyFrom(const T* A, Rank lo, Rank hi);//复制
void expand();//向量扩容
int max(int a, int b) {
return a > b ? a : b; }
public:
//构造函数
Vector(int c = DEFALUT_CAPACITY)
{
elem = new T[capacity = c];
_size = 0;
}
//拷贝构造函数
Vector(const T* A, Rank lo, Rank hi) //数组区间复制
{
copyFrom(A, lo, hi);
}
Vector(const Vector<T> & V,Rank lo,Rank hi)//向量区间复制
{
copyFrom(V.elem, lo, hi);
}
Vector(const Vector<T> & V)//向量整体复制
{
copyFrom(V.elem, 0, V._size);
}
//析构函数 释