MyVector

  • Post author:
  • Post category:其他


自用,自写,防遗忘

思路从出生,到回归,然后按照应该有的函数进行书写,由于本来就是自用,与stl里面会有部分差异,但是大体一样,此过程用于熟悉vector这个动态数组的概念,可变的数组

MyVector.h 文件,里面的调用只有iostream

#pragma once
#include"stdafx.h"

//stdafx.h里面调用了打印,用来测试跟踪内存来着,现在所有输出都已经注释掉了,其实跟踪释放情况的最好方法就是重载delete
//出错两种解决方案,抛异常或者不管,我选择都不管,谁调用谁出错谁负责,优先保证主体没问题
//由于是模拟,按照自己想法设计,所以有的有,有的没有,有些功能多一些,有些少一点的,毕竟完全设计出stl里的话还不如直接用stl
//所有结尾方式采用的是逾尾结束,因为这样写是< 方便一点

template<class T>
class MyVector
{
	T *pBuff;		//存储空间
	size_t len;		//元素个数
	size_t Mlen;	//变化的最大容量
public:
	struct Myiterator   //智能指针
	{
		T *p;

		Myiterator()		//防意外,出生即为空
		{
			p = NULL;
		}

		//重载=,方便进行智能指针的赋值
		Myiterator& operator =(Myiterator const& srcIt)
		{
			p = srcIt.p;
			return *this;		//返回类型是一个智能指针,不能返回p,返回自身地址this,返回自身地址里的内容*this
		}

		//重载* 直接获得指针位置的数据
		T operator *()
		{
			return *p;
		}

		//重载说明 由于是模拟动态数组,我选择的方式是用pBuff开堆内存,而实际stl里的vector由一个参量是内存模型,这个内存模式不让我们使用,所以stl里的vector的智能指针的+,++运算等包括erase等函数和我所设计的MyVector是完全不同的,由于采用new/malloc开辟堆内存,物理位置逻辑位置均连续,所以可以进行下面赋值方法,如选择其他模拟方法,请慎重拷贝,借鉴

		//重载+ 指针的+操作是向后移动n个T类型,不是n个位字节
		Myiterator operator +(int n)
		{
			Myiterator it;
			it.p = p;
			it.p += n;
			return it;
			//上下两种看习惯,喜欢用哪个就用哪个
			//p += n;
			//return *this;
		}
		//重载- 指针快速前移
		Myiterator operator -(int n)
		{
			Myiterator it;
			it.p = p;
			it.p -= n;
			return it;
		}
		//重载 前++
		Myiterator& operator ++()
		{
			p++;
			return *this;
		}
		//重载后++
		Myiterator& operator ++(int)
		{
			p++;
			return *this;
		}
		//重载前--
		Myiterator& operator --()
		{
			p--;
			return *this;
		}
		//重载后--
		Myiterator& operator --(int)
		{
			p--;
			return *this;
		}

		//重载差,用于返回两个指针之间的元素个数
		int operator -(Myiterator const &srcIt) const
		{
			return p - srcIt.p;
		}

		//重载!= 判断是否指向同一个位置
		bool operator != (Myiterator const &srcIt) const
		{
			return p != srcIt.p;
		}
		bool operator ==(Myiterator const &srcIt) const
		{
			return p == srcIt.p;
		}
		//智能指针是否需要比大小呢,感觉没必要,没意义,判断谁在前谁在后不知道有什么,因为一旦需要先后关系,都是用来取值,然后判断是否需要直接退出
	};

	MyVector();					//默认构造
	MyVector(int const len);		//传入空间大小
	MyVector(MyVector &t);				//传入同类型vector,拷贝构造
	MyVector(int const n, T const& srcDate);	//传入n个相同的数
	MyVector(T const srcDate[], int const len);		//一个数组src,前len个元素
	MyVector(Myiterator const begin, Myiterator const end);	//用vector的智能指针,截取一段内容
	~MyVector();			//析构

	//assign	清空数组,并导入不同的元素,Erases a vector and copies the specified elements to the empty vector.
	void assign(T const n, T const& srcDate);		//导入n个相同的srcDate数据	
	void assign(Myiterator begin, Myiterator end);		//导入vector的一段数据
	void assign(T const srcDate[],int const begin,int const end);		//导入数组的一段数据

	//at 返回处于指令位置的数据,Returns a reference to the element at a specified location in the vector.
	T at(int index);

	//begin 返回第一个位置 Returns a random - access iterator to the first element in the container.
	Myiterator begin();

	//end 返回最后一个逾尾位置  Returns a random - access iterator that points just beyond the end of the vector.
	Myiterator end();

	//front 返回第一个元素  Returns a reference to the first element in a vector.
	T front();

	//back 返回最后一个元素 Returns a reference to the last element of the vector.
	T back();

	//capacity 返回容器容量 Returns the number of elements that the vector could contain without allocating more storage. 
	size_t capacity();

	//size 返回容器元素个数  Returns the number of elements in the vector.
	size_t size();

	//max_size 内存可开辟最大空间,内存模型,系统等决定  Returns the maximum length of the vector.
	void max_size();

	//clear 清空容器中的元素 Erases the elements of the vector.
	void clear();

	//empty 检测容器是否为空 Tests if the vector container is empty.
	bool empty();

	//erase 清除指针位置的元素 Removes an element or a range of elements in a vector from specified positions.
	void erase(Myiterator &pos);
	void erase(Myiterator &begin, Myiterator &end);		//删除一段数据

	//没用过 内存模型,不让改动的,除非你是设计师 Returns an object to the allocator class used by a vector.
	void get_allocator();

	//insert 在智能指针位置插入数据  Inserts an element or a number of elements into the vector at a specified position.
	void insert(Myiterator &pos,T const &srcDate);
	void insert(Myiterator &pos, T const srcDate[], size_t n);		//在指定位置插入一段数据
	void insert(Myiterator &pos, Myiterator begin, Myiterator end);		//在指定位置插入一段容器里的数据
	
	//pop_back 弹出最后一个元素  Deletes the element at the end of the vector.
	T pop_back();

	//push_back 在最后添加数据  Add an element to the end of the vector.
	void push_back(T const &srcDate);

	//rbegin 逆向计算开头  Returns an iterator to the first element in a reversed vector.
	Myiterator rbegin();

	//rend 逆向计算逾尾终点  Returns an iterator to the end of a reversed vector.
	Myiterator rend();

	//reserve 更改最大空间,只会扩大不会减小 Reserves a minimum length of storage for a vector object. 
	void reserve(size_t M);

	//resize 更改元素个数,小于已有元素个数,则截取,大于已有元素个数小于容量空间,补0,大于容量空间,重分配,补0 Specifies a new size for a vector.
	void resize(size_t n);

	// swap 交换一段数据 Exchanges the elements of two vectors.
	void swap(MyVector &temp);
	void swap(Myiterator begin, Myiterator end);		//感觉这个不太合适,但还是先写上,只进行同个数交换
	void swap(MyVector &dest, Myiterator begin, Myiterator end); //与另一个容器的一段空间进行交换

	//容器的大小关系
	bool operator == (MyVector const & srcVector) const;
	bool operator != (MyVector const & srcVector) const;
	bool operator >(MyVector const &sreVector)const;
	bool operator <(MyVector const &sreVector)const;
	bool operator >=(MyVector const &sreVector)const;
	bool operator <=(MyVector const &sreVector)const;

	//容器赋值
	void operator =(MyVector const &sreVector)const;
};



template<class T>
MyVector<T>::MyVector()		//默认构造
{
	pBuff = NULL;
	len = 0;
	Mlen = 0;
}

// new 一个空间为0的数组也是有地址的,有地址就很危险
template<class T>
MyVector<T>::MyVector(int const len)		//只知道空间大小,却没有数据
{
	Mlen = len;
	this->len = 0;
	if (Mlen)		//防new 0
		pBuff = new T[len]();
	else
		pBuff = NULL;
}

template<class T>
MyVector<T>::MyVector(T const srcDate[],int const len)		//把一个数组里的前n个数据拷过来
{
	this->len = len;
	Mlen = len;
	if (Mlen)		//防new 0
	{
		pBuff = new T[this->len];
		memcpy(pBuff, srcDate, sizeof(srcDate)*len);		//内存拷贝 memcpy从src位置开始进行内存拷贝
	}
	else
		pBuff = NULL;
}

template<class T>
MyVector<T>::MyVector(int const n, T const &srcDate)	//拷入n个src数据
{
	len = n;
	Mlen = n;
	if (len)		//防new 0
	{
		pBuff = new T[len];
		for (int i = 0; i < n; i++)
			pBuff[i] = srcDate;
	}
	else
		pBuff = NULL;
}

template<class T>				
MyVector<T>::MyVector(MyVector &t)		//拷贝构造,需要开辟内存深拷贝
{
	len = t.len;
	Mlen = t.len;
	if (len)		//防new 0 因为另一个容器可能没有元素,但是有容量,而拷贝的时候我们关注的是里面数据,而不是容量,毕竟是动态数组,容量问题不需要使用者关心
	{
		pBuff = new T[len];
		memcpy(pBuff, t.pBuff, sizeof(T)*len);
	}
	else
		pBuff = NULL;
}

template<class T>
MyVector<T>::MyVector(Myiterator const begin, Myiterator const end)	//把一个容器的一段内容拷过来
{
	int t = end - begin;
	if (t<=0)			//智能指针的位置反了,拒绝拷贝,或者删掉这里,直接报错
	{
		len = 0;
		Mlen = 0;
		pBuff = NULL;
		return;
	}
	len = t;
	Mlen = t;
	if (len)		//防new 0
	{
		pBuff = new T[len];
		memcpy(pBuff, begin.p, sizeof(T)*len);
	}
	else
		pBuff = NULL;
}

template<class T>
MyVector<T>::~MyVector()	//析构
{
	if (pBuff)
	{
		delete[] pBuff;
		pBuff = NULL;
		//printf("delete\n");			//用于跟踪内存释放
	}
}

template<class T>
void MyVector<T>::assign(T const n, T const& srcDate)		//修改成n个相同的srcDate数据	
{
	if (pBuff)		//原有数据不要了,需要释放
	{
		delete[] pBuff;
		pBuff = NULL;
		//printf("delete\n");	// 跟踪释放情况
	}
	len = n;
	Mlen = n;
	if (len)		//防止出现0个src然后new 0
	{
		pBuff = new T[len];
		for (int i = 0; i < n; i++)
			pBuff[i] = srcDate;
	}
}

template<class T>
void MyVector<T>::assign(Myiterator begin, Myiterator end)		//修改成vector的一段数据
{
	if (pBuff)		//删原有数据
	{
		delete[] pBuff;
		pBuff = NULL;
		//printf("delete\n");			//跟踪释放情况
	}
	len = 0;
	Mlen = 0;
	int t =  end-begin;			//不知道是否会出现智能指针反了的情况,反了就认为你想弄个0,按理说保险起见应该在加一个pBuff=NULL;但是自信没有出现野指针,出现了别说没提醒
	if (t>0)
	{
		len = t;
		Mlen = t;
		pBuff = new T[len];
		Myiterator temp = begin;
		for (int i = 0; i < t;i++)
		{
			pBuff[i] = *temp;			//不建议pBuff【i】,毕竟其本质是个指针,但是谁叫这个用的舒服
			++temp;
		}
	}
}

template<class T>
void MyVector<T>::assign(T const srcDate[], int const begin, int const end)		//修改成数组的一段数据,完全是为了和上面的vector一段数据进行匹配,方便使用
{
	if (pBuff)			//删除原有数据
	{
		delete[] pBuff;
		pBuff = NULL;
		//printf("delete\n");		//跟踪释放情况
	}
	len = 0;
	Mlen = 0;
	int t = end - begin;		//如果方向反了,默认为空
	if (t > 0)
	{
		len = t;
		Mlen = t;
		pBuff = new T[len];
		t = begin;
		for (int i = 0; i < t;i++)
			pBuff[i] = srcDate[t+i];
	}
}

template<class T>
T MyVector<T>::at(int index)		//at返回index位置的数据
{
	return pBuff[index];
}

template<class T>		//依赖名称而不是类型 typename
typename MyVector<T>::Myiterator  MyVector<T>::begin()		//返回开始位置
{
	Myiterator it;
	it.p = pBuff;
	return it;
}

template<class T>
typename MyVector<T>::Myiterator MyVector<T>::end()		//返回逾尾位置
{
	Myiterator it;
	it.p = pBuff + len;
	return it;
}


template<class T>
T MyVector<T>::front()		//返回第一个元素
{
	return pBuff[0];
}

template<class T>
T MyVector<T>::back()		//返回最后一个元素
{
	return pBuff[len - 1];
}


template<class T>
size_t MyVector<T>::capacity()	//返回容器容量大小
{
	return Mlen;
}

template<class T>
size_t MyVector<T>::size()		//返回元素个数
{
	return len;
}

template<class T>
void MyVector<T>::clear()		//把元素清空,但是原有空间保留
{
	len = 0;
	memset(pBuff, 0, Mlen);
}

template<class T>
bool MyVector<T>::empty()			//判断是否动态数组是否为空,提供接口,调用出错
{
	if (len == 0)
		return true;
	return false;
}

template<class T>  
void MyVector<T>::erase(Myiterator &pos)	//由于我们物理位置逻辑位置均连续,删除后,智能指针还是指向那个位置,不需要变化,而按照stl里面,清除一个数据后,他的智能指针不再安全,会是一个位置值,有时候是下一个,有时候是一个随机值
{
	if ((pos-begin()) >= len)			//开始提醒有符号无符号的匹配问题,指针位置在数组开头的前面,按理说应该交给调用的时候处理
		return;
	int index = pos.p - pBuff;			//数组的删除很慢
	for (int i = index; i < len; i++)
	{
		pBuff[i] = pBuff[i + 1];
	}
	len--;
}

template<class T>
void MyVector<T>::erase(Myiterator &begin, Myiterator &end)		//删除一段数据
{
	int t = end - begin;
	//int k = len;
	if (end.p - pBuff >= len)			//开删除一段数据,如果数据端超过末尾,那么有一段是不需要删除的,但是注意指针本身就存在越界的可能性
		t = pBuff + len - begin.p;		//pBuff+len 获得末尾位置
	if (begin.p - pBuff >= len)		//发现删除的起点比元素个数多,没有删的空间
		return;
	if (t <= 0)			//前后关系反了
		return;
	int indexBeg = begin.p - pBuff;		//记录开头
	int indexEnd = end.p - pBuff;		//记录末尾
	while(indexEnd<len)			//把末尾的值赋给开头,然后双双移动
	{
		pBuff[indexBeg] = pBuff[indexEnd];
		indexBeg++;
		indexEnd++;
	}
	len = len - t;
}

template<class T>
void MyVector<T>::insert(Myiterator &pos, T const &srcDate)		//插入pos位置的一个数据
{
	if (len >= Mlen)  //应该不会出现大于的情况,保险点写上,等于的时候代表容器容量Mlen里装了len个元素,已经装满了 这段扩展空间的代码应该写成一个函数,毕竟使用了很多次,可以以后开发新功能的时候还需要这个开辟空间
	{
		Mlen = Mlen + ((Mlen >> 1) > 1 ? (Mlen >> 1) : 1);		//近似于1.5倍的一次次扩展
		T *tempBuff = new T[Mlen];
		memcpy(tempBuff, pBuff, sizeof(T)*len);
		if (pBuff)
			delete[] pBuff;
		pBuff = tempBuff;
	}
	int index = pos.p - pBuff;		//获得插入位置,注意存在插入位置超出末尾的情况
	if (index > len)
		index = len;
	for (int i = len; i > index; i--)		//从后往前依次赋值
		pBuff[i] = pBuff[i - 1];
	pBuff[index] = srcDate;
	len++;
}

template<class T>
void MyVector<T>::insert(Myiterator &pos, T const srcDate[], size_t n)		//插入一段数据,来源自一个数组的前n个数据
{
	int t = len + n;		//可能元素很多,需要放大多次,利用flag,一次性拷贝,稍微快一点传输数据,不然放大一次拷贝一次, 
	bool flag = false;
	while (t > Mlen)
	{
		Mlen = Mlen + ((Mlen >> 1) > 1 ? (Mlen >> 1) : 1);
		flag = true;
	}
	if (flag)				//改变容器容量
	{
		T *tempBuff = new T[Mlen];
		int m = pos - begin();		//m记录插入位置
		if (m > len)
			m = len;
		memcpy(tempBuff, pBuff, sizeof(T)*m);		//拷贝前半部分数据
		for (int i = 0; i < n; i++)				//拷贝数组数据
			tempBuff[m + i] = srcDate[i];
		memcpy(tempBuff + m+n, pBuff + m, sizeof(T)*(len - m));	//拷贝后半部分数据
		delete[] pBuff;
		pBuff = tempBuff;
		len = len + n;			//别忘了改变元素个数
		return;
	}
	
	//下面是没有改变容器容量,没用else可能不太显眼 
	int m = pos - begin();
	if (m>len)
		m = len;
	for (int i = 0; i < n; i++)
		pBuff[len + n - 1 - i] = pBuff[len - 1 - i];			//最后一个元素的位置(结尾)len+需要插入的元素个数n-前一个位置1-计数器i
	Myiterator it = pos;
	for (int i = 0; i < n; i++,it++)
		pBuff[m] = srcDate[i];
	len = len + n;
}

template<class T>
void MyVector<T>::insert(Myiterator &pos, Myiterator begin, Myiterator end)		//在指定位置插入一段容器里的数据
{
	int n = end - begin;
	if (n <= 0)			//先后关系反了或者没有元素,不插入
		return;			
	int t = len + n;		//可能元素很多,需要放大多次,利用flag,一次性拷贝,稍微快一点传输数据,不然放大一次拷贝一次
	bool flag = false;
	while (t > Mlen)
	{
		Mlen = Mlen + ((Mlen >> 1) > 1 ? (Mlen >> 1) : 1);
		flag = true;
	}
	if (flag)				//改变容器容量
	{
		T *tempBuff = new T[Mlen];
		int m = pos.p - pBuff;		//m记录插入位置
		if (m > len)
			m = len;
		memcpy(tempBuff, pBuff, sizeof(T)*m);		//拷贝前半部分数据
		Myiterator temp;
		temp = begin;
		for (int i = 0; i < n; i++,temp++)				//拷贝容器里的数据
			tempBuff[m + i] = *temp;
		memcpy(tempBuff + m + n, pBuff + m, sizeof(T)*(len - m));	//拷贝后半部分数据
		delete[] pBuff;
		pBuff = tempBuff;
		len = len + n;			//别忘了改变元素个数
		return;
	}

	//下面是没有改变容器容量,没用else可能不太显眼 
	int m = pos.p - pBuff;
	if (m>len)
		m = len;
	for (int i = 0; i < n; i++)
		pBuff[len + n - 1 - i] = pBuff[len - 1 - i];			//最后一个元素的位置(结尾)len+需要插入的元素个数n-前一个位置1-计数器i
	Myiterator it = pos;
	Myiterator it2 = begin;
	for (int i = 0; i < n; i++, it++,it2++)
		pBuff[m] = *it2;
	len = len +n;
}

template<class T>
T MyVector<T>::pop_back()		//stl 不返回,不检查,单独扔掉最后一个元素,我没那么做,反正void类型的话 只能单独,最后一个元素万一还有点用途,需要两个代码调用和删除
{
	T temp = pBuff[len - 1];		//动态数组的末尾删除
	len--;
	return temp;
}

template<class T>
void MyVector<T>::push_back(T const &srcDate)		//还是void合适,毕竟是压入一个数据,这个数据应该是有地方保存的,如果是一个一次性的常量,那就两行吧
{
	if (len >= Mlen)		//确认空间容量问题
	{
		Mlen = Mlen + ((Mlen >> 1) > 1 ? (Mlen >> 1) : 1);
		T *tempBuff = new[Mlen];
		memcpy(tempBuff, pBuff, sizeof(T)*len);
		if (pBuff)
			delete[] pBuff;
		pBuff = tempBuff;
	}
	pBuff[len] = srcDate;		//动态数组的末尾插入,末尾位置len,注意逾尾
	len++;
}

template<class T>
typename MyVector<T>::Myiterator rbegin()		//方便智能指针定位,逆向排列的第一个,即正数最后一个元素
{
	Myiterator it;
	it.p = pBuff[len - 1];
	return it;
}

template<class T>
typename MyVector<T>::Myiterator rend()			//方便智能指针定位,逆向排列的最后一个,即正数第一个元素,但是由于要逾尾,需要-1
{
	Myiterator it;
	it = pBuff - 1;
	return it;
}

template<class T>
void MyVector<T>::reserve(size_t M)		//只改变容器容量大小,其他不变
{
	if (Mlen >= M)			//就怕0  给的空间太小不变,-是为了防止两个0, 空容器和0大小
		return;
	Mlen = M;
	T *temp = new T[Mlen];
	if (pBuff)
	{
		memcpy(temp, pBuff, sizeof(T)*len);
		delete[] pBuff;
	}
	pBuff = temp;
}

template<class T>
void MyVector<T>::resize(size_t n)		//改变元素个数
{
	if (len >= n)			//需要前n个元素,n后面的元素舍去
	{
		len = n;
		return;
	}
	if (n > Mlen)		//需要n个元素,太多了,这个扩展容量的代码又重复了一遍
	{
		Mlen = Mlen + ((Mlen >> 1) > 1 ? (Mlen >> 1) : 1);
		T *tempBuff = new[Mlen]();
		memcpy(tempBuff, pBuff, sizeof(T)*len);
		if (pBuff)
			delete[] pBuff;
		pBuff = tempBuff;
		return;
	}

	//不需要扩大容量 len < n < Mlen
	for (int i = len; i < n; i++)		//多出去的元素补0
		pBuff[i] = 0;
}

template<class T>
void MyVector<T>::swap(MyVector &temp)		//和一个容器进行交换
{
	MyVector t;

	t.len = len;
	t.Mlen = Mlen;
	t.pBuff = pBuff;

	len = temp.len;
	Mlen = temp.Mlen;
	pBuff = temp.pBuff;

	temp.len = t.len;
	temp.Mlen = t.Mlen;
	temp.pBuff = t.pBuff;

	t.pBuff = NULL;		//这是一个可怕的事情,如果没有这个,交换后确实地址交换了,t和temp指向同一个位置,但是由于t在栈区,函数调用完即消失,t调用析构,然后temp就指向了一个不存在的地址
}

template<class T>
void MyVector<T>::swap(Myiterator begin, Myiterator end)		//必须等容量,不等容量的话,那个交换会改变另一个容器的成员变量,需要多一个参数用以获得容器位置
{
	int t = end - begin;
	if (t!=len)
		return;
	Myiterator it = begin;
	int m;
	for (int i = 0; i < len; i++)
	{
		m = pBuff[i];
		pBuff[i] = *it;
		*it = m;
		it++;
	}
}

template<class T>
void MyVector<T>::swap(MyVector &dest, Myiterator begin, Myiterator end)		//这个可以不写,然而真的不太想写,然后就犯懒吧
{
	//犯懒了,直接使用一段删除和一段插入
	if (end - begin <= 0)		//智能指针反了
		return;
	MyVector<T> temp(begin, end);		//把目标位置的东西取出来
	dest.erase(begin, end);
	if (pBuff)			//在目标位置插入这边的元素
	{
		dest.insert(begin, pBuff);
		delete[] pBuff;
	}

	pBuff = temp.pBuff;		//把目标位置的元素拷过来
	len = end - begin;
	Mlen = end - begin;

	temp.pBuff = NULL;	//同上面的交换问题
}

// 容器大小关系的判断,前提要求,元素可以比大小。
template <class T>
bool MyVector<T>::operator !=(MyVector const & srcVector) const		//容器比大小,是否是同一个容器
{
	return !(*this == srcVector);
}

template <class T>
bool MyVector<T>::operator ==(MyVector const & srcVector) const
{
	if (num == srcVector.num)
	{
		for (size_t i = 0; i < num; ++i)
		{
			if (pBuff[i] != srcVector.pBuff[i])
				return false;
		}
		return true;
	}
	return false;
}


//容器大小关系的判断,前提要求,元素可以比大小。如果元素个数不同,直接出结果,元素多的大,如果元素个数一样,开始进行依次比较,直到比出大小,数大的/ascii码大的大,具体看T的类型
template <class T>
bool MyVector<T>::operator >(MyVector const &sreVector)const
{
	if (num > sreVector.num)
		return true;
	if (num < sreVector.num)
		return false;
	for (size_t i = 0; i < num; ++i)
	{
		if (pBuff[i] > srcVector.pBuff[i])
			return true;
		if (pBuff[i] < srcVector.pBuff[i])
			return false;
	}
	return false;
}

template <class T>
bool MyVector<T>::operator <(MyVector const &sreVector)const
{
	if (num > sreVector.num)
		return false;
	if (num < sreVector.num)
		return true;
	for (size_t i = 0; i < num; ++i)
	{
		if (pBuff[i] > srcVector.pBuff[i])
			return false;
		if (pBuff[i] < srcVector.pBuff[i])
			return true;
	}
	return true;
}

template <class T>
bool MyVector<T>::operator >=(MyVector const &sreVector)const
{
	if (num > sreVector.num)
		return true;
	if (num < sreVector.num)
		return false;
	for (size_t i = 0; i < num; ++i)
	{
		if (pBuff[i] > srcVector.pBuff[i])
			return true;
		if (pBuff[i] < srcVector.pBuff[i])
			return false;
	}
	return true;
}

template <class T>
bool MyVector<T>::operator <=(MyVector const &sreVector)const
{
	if (num > sreVector.num)
		return false;
	if (num < sreVector.num)
		return true;
	for (size_t i = 0; i < num; ++i)
	{
		if (pBuff[i] > srcVector.pBuff[i])
			return false;
		if (pBuff[i] < srcVector.pBuff[i])
			return true;
	}
	return true;
}

//容器的复制
template <class T>
void MyVector<T>::operator =(MyVector const &sreVector)const
{
	if (pBuff)
		delete[] pBuff;
	num = sreVector.num;
	maxNum = sreVector.maxNum;
	pBuff = new T[num];
	memcpy(pBuff, sreVector.pBuff, sizeof(T)* num);
}

以下可以不看

stdafx.h 用于部分头文件

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

#include"MyVector.h"
#include<iostream>
#include<vector>
using namespace std;




// TODO:  在此处引用程序需要的其他头文件

主程

// MyVector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



int _tmain(int argc, _TCHAR* argv[])
{
	MyVector<int> a1;
	MyVector<int> a2(10);
	int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	MyVector<int> a3(a, 7);
	MyVector<int> a4(5,6);
	MyVector<int> a5(a3);
	
	MyVector<int>::Myiterator it1;
	MyVector<int>::Myiterator it2;
	it1 = a3.begin();
	it2 = a3.end()-3;

	MyVector<int> a6(it1, it2);
	a1.assign(4, 10);
	++it1;
	a2.assign(it1, it2);
	a3.assign(a, 4, 10);
	it1 = a3.begin();
	printf("%d\n", a3.at(3));
	a4.clear();
	it1 = a3.begin() + 4;
	it2 = a3.end() + 5;
	//for (int i = 0; i < 5; i++)
	//	a3.erase(it1);
	a3.erase(it1, it2);
	a3.insert(it1, 2);
	a3.insert(it1, a, 10);
	it1 = a3.begin();
	it2 = a3.begin()+5;
	MyVector<int>::Myiterator it3;
	it3 = a5.begin();
	a5.insert(it3, it1, it2);
	printf("%d\n", a5.pop_back());
	a3.swap(a5);
	return 0;
}



版权声明:本文为qq_40488600原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。