函数模板实现线性表Vector(动态数组)

模板设计

首先创建一个模板类vector,这个vector中有保护元素:类指针、记录当前已有多少元素的整形变量space,记录该vector当前最大容量的整形变量,其中类指针指向的是一个动态数组,当元素不够存储时,会自动将原数组的容量扩大2倍,在该动态数组上进行添加、删除元素时直接在对该指针指向的数组上直接进行增删查改,该模板类拥有自己的成员函数,它的成员函数是对该类的功能的使用,例如:清空整个vector或者返回当前vector中有多少个元素。

功能设计

在这里插入图片描述在这里插入图片描述

代码

–main.cpp

#include <iostream> 
#include<assert.h>
#include"myvector.h"
using namespace std; 
 
int main()
{
   cout<<"创建一个vector,vec"<<endl<<endl; 
   vector <int> vec; 
   vec.push_back(2); vec.push_back(5);  vec.push_back(3); 
   cout<<"尾部添加元素{2,5,3}"<<endl<<"vec内元素为:"<<endl; vec .Display(); 
   vec.pop_back() ; 
   cout<<"尾部删除元素 "<<endl<<"vec内元素为:"<<endl; vec .Display();
   vec.push_back(7); 
   cout<<"尾部添加元素7"<<endl<<"vec内元素为:"<<endl; vec .Display();
   vector <int >  vec1 ;
   cout<<"将vec赋值给vec1"<<endl; 
   vec1 = vec;
   cout<<"输出vec1为:";
   vec1.Display(); 
   vec1.insert(1,25);
   cout<<"输出vec1为:";
   vec1.Display(); 
   cout<<"输出vec1第一个元素:"<<vec1.front()<<endl;
   cout<<"输出vec1的组后一个元素:"<<vec1.back()<<endl<<endl;  
   cout<<"利用迭代器删除vec中元素值为2的元素" <<endl;
   for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
	{
		if(*iter == 2)
		vec.erase(iter);
	} 
	cout<<"输出vec为:";
    vec.Display();  
    cout<<"输出vec的大小:  "<<vec.size() <<endl<<endl; 
    cout<<"输出vec所占内存实际大小:  "<<vec.capacity()<<endl<<endl;
    cout<<"利用下标访问vec中的第一位元素为:";
	cout<<vec[0]<<endl;
	cout<<"清空vec"<<endl;vec.clear();
	cout<<"输出vec为空?为空输出1,不为空输出0"<<endl;
	cout<<"输出结果:"<<vec.empty()<<endl; 
	
    return 0;
}
/*
1.vector大小:vector.size()   
2.vector所占内存实际大小:vector.capacity()   
3.尾部添加元素:vector.push_back() 	 
4.尾部删除元素:vector.pop_back() 	  
5.实现vector赋值重载   
6.清空vector元素:vector.clear()   
7.删除指定元素:vector.erase(it)    
 	erase(int first ) erase(int first,int last)
8.a.vector开始指针:vector.begin() 
9.b.vector尾部指针:vector.end()     
10.下标访问:vector[1]   
11.访问第一个元素:vector.front()  
12.访问最后一个元素:vector.back()  
13.改变vector的大小vector.resize(int n) 
14.pos位置插入一个elem元素  insert(int pos,const T  elem)  
insert(int pos,int n,int elem);   //在pos位置插入n个elem数据,无返回值。 
15. rbegin()        返回一个指向map尾部的逆向迭代器 
16.rend()          返回一个指向map头部的逆向迭代器 
17 .empty()
 */

myvector.h

#include <iostream> 
#include<assert.h>
using namespace std; 

template <typename T >  class vector
{
	protected:
	    T*  data;
	    int space = 0;
	    int max_size = 0;
	public:
		typedef T* iterator;
	    vector(int max = 5){
		    data = new T[max]; 
	        space = 0;
	        max_size = max;
	    }
	    ~ vector(){ delete [] data; }
	    void clear(){
	    	space = 0;
		}
	    int capacity(){  //vector容量大小
	    	return max_size;
		}
		int size(){  //vector的占内存实际大小
	    	return  space;
		}
		vector<T> & operator= (  vector<T> &v)  //赋值运算符的重载
		{
			if (this != &v)
			{
				space = v.size();
				max_size = v.capacity(); 
				data = new T[max_size];
				for (size_t i = 0; i < v.size(); ++i)
				{
					data[i] = v.data[i];
				}
			}
			return*this;
		} 
		void resize(int newspace) 
	    { 
	        T *temp = new T[newspace];
	        for(int i=0; i<space-1;i++)
	        {
	           temp[i]=data[i];
	        }
	        delete[]data;
	        max_size = newspace;
	        swap(data,temp);
	    }
	    void push_back(const T x) //增加尾元素 
	    {
	        if( max_size < space +1 )
	        {
	            resize(2*space);
	        }
	        data[space++]=x;
	    }  
	    void pop_back() //删除尾元素 
	    {
	    	if ( space == 0 )  ; 
//	        for(int i=0;i<space-1;i++) data[i] = data[i+1];
	        space--;
		}  
		bool empty(){
			if(space == 0) return true;
			return false;
		}
		void insert(int pos, const T  elem)//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
		{
//			cout<<"elem:"<<elem<<endl;
			pos--;
			T *temp = new T[max_size];
	        for(int i=0; i<pos ;i++)
	        {
	           temp[i]=data[i];
	        }
	        temp[pos] = elem;
	        space++;
//	        if( max_size < space )   resize(2*space); 
	        for(int i=pos+1; i<space;i++)
	        {
	           temp[i]=data[i-1];
	        }
			swap(data,temp);
	        delete[]temp;  
		}   
		void insert(int pos,int n,int elem)  //在pos位置插入n个elem数据 
		{
			T *temp = new T[max_size];
	        for(int i=0; i<pos-1;i++)
	        {
	           temp[i]=data[i];
	        }
	        space = space+n;
	        if( max_size < space )   resize(2*space); 
	        for(int i=0;i<n;i++)
	        	temp[pos+i] = elem;
	        for(int i=pos+n; i<space;i++)
	        {
	           temp[i]=data[i-1];
	        }
	        delete[]data; 
	        swap(data,temp);
		}   
		iterator begin()  {return &data[0];}
    	iterator end()  {return &data[space];} 
		iterator rbegin()   {return &data[space];} 
		iterator rend()  {return &data[0];} 	
		void erase(iterator first )
		{ 
			T *temp = new T[max_size];
			int count = 0;
	        for(int i=0; i< space;i++)
	        {
	           if( i+&data[0] == first )  ;
	           else  temp[count++]=data[i];
	        }
	        delete[] data; 
			space = count ;  
	        swap(data,temp); 
		} 
		void erase(int first,int last)
		{
			T *temp = new T[max_size];
			int count = 0;
	        for(int i=0; i< space ;i++)
	        {
	           if(i<last&&i>=first-1) ;
	           else  temp[count++]=data[i];
	        }
	        delete[] data;
			space = count ; 
	        swap(data,temp);
		} 
		T front(){ if(space != 0) return data[0]; };   //返回第一个数据。
		T back(){ if(space != 0)return data[space-1];};  //返回最后一个数据。
		void erase(int first )
		{
			T *temp = new T[max_size];
			int count = 0;
	        for(int i=0; i< space;i++)
	        {
	           if(i==first) ;
	           else  temp[count++]=data[i];
	        }
	        delete[] data;
			space = count ; 
	        swap(data,temp);
		} 
		
	    T& operator[](int index)  
		{ 
//			cout<<this->data[index]<<endl;
			return this->data[index];
		} 
		void Display()
		{ 
			for (int i = 0; i < space; ++i)
			{
				cout << data[i];
				cout << " ";
			}
			cout << endl<<endl;
		}
		 
};

测试结果

在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值