数据结构-实现向量

#include<iostream>
using namespace std;
class Vector{
  int cap;
  int sz;
  int* buf;
public:
   Vector(){sz=0;cap=4;buf=new int[4];}
   Vector(int n,int v=0); 
   Vector(const Vector &a){            //复制构造函数 
   	buf=new int[a.cap];
   	sz=a.sz;cap=a.cap; 
   	for(int i=0;i<a.sz;i++)
   	  buf[i]=a.buf[i];}	 
   	  
   ~Vector(){ delete[] buf;}             //析构函数 
   
   void push_back(int val){             //在向量末尾加val 
    if(sz>=cap){                        //容量不够时,扩容 
		    if(cap==0)cap=2;
		int*buf2=new int[cap*=2];        //开辟一个新空间,以便后续数据的存放 
	    memcpy(buf2,buf,sz*sizeof(int)); //把原buf数组中所有数据存入buf2中,用memcpy函数 
		buf2[sz]=val;                    //使buf2的最后一个位置存val   
		delete[]buf;                     //删除原buf数组,并用新的buf2数组代替 
		buf=buf2; }
	else {buf[sz]=val;}                   //容量够时,直接加到末尾 
	sz++;}                                //长度加1 
	
	
   void pop_back(){sz--;}                 //删除末尾一个数 
   
   void push_front(int val){              //从头部添加数据 
   	if(sz>=cap){                          //若容量不够,则扩充 
		    if(cap==0)cap=2;
		int*buf2=new int[cap*=2];         //容量扩为原来的两倍 
	    memcpy(buf2+1,buf,sz*sizeof(int));//把buf数组中所有数据放到buf2第一个位置后面(即从第二个位置放起) 
		buf2[0]=val;                      //val存入buf2第一个位置  
		delete[]buf;                      //删除原buf数组,并用新的buf2数组代替  
		buf=buf2; }
	else{
	     for(int i=sz;i>0;i--)           //若容量够,则把原数据全都往后挪一个单元 
   	      buf[i]=buf[i-1];
   	      buf[0]=val;}                   //val添加到首部
	 sz++;                  
	} 
   
   void pop_front(){                      //删除首部数据 
   	sz--;                                  
   for(int i=0;i<sz;i++)
     buf[i]=buf[i+1];}
     
   void clear(){                          //清空该向量 
    delete [] buf;}
    
   void insert(int i,int val){            //在第i个位置后插入val; 
    if(i>sz||i<0) return;                 //若该对象的长度不足i,或者i小于0,则直接返回(无法在第i 个位置后插入数据) 
    if(sz>=cap){                          //若容量不够,则扩容 
		if(cap==0)cap=2;
		int*buf2=new int[cap*=2];
		memcpy(buf2,buf,i*sizeof(int));   //先把前i个数据复制到buf2中 
		buf2[i]=val;                      //第i+1个位置存入val 
		memcpy(buf2+i+1,buf+i,(sz-1)*sizeof(int));//后面的数据放到i+1个位置后 
		delete[]buf;                      //删除原buf数组,并用新的buf2数组代替   
		buf=buf2; }
	
	else{                                 //若容量够用,则直接在i个位置后插入数据                            
		for(int j=sz-1;j>=i;j--)          //将第i个位置后的所有数据往后挪一个单位  
		 buf[j+1]=buf[j];
		 buf[i]=val;}                     //第i+1个位置存入val 
	sz++;
	}
	
	
	
   void erase(int val){                   //删除向量中第一个存val数据的位置 
     int temp,j;               
   	for(j=0;j<sz;j++)                 //先找到这个位置 
   	   if(buf[j]==val){
		  temp=j;
		  break; } 
   	if(j==sz) {                          //若不存在val这个数,提示并返回 
	   cout<<"该向量中不存在"<<val<<"这个数" <<endl;
	   return;
	   }
    sz--;
   	for( j=temp;j<sz;j++)            //用把后面的数据用往前挪一个单位的方式删除第一个val 
   	  buf[j]=buf[j+1];
	 }
   
   int size(){return sz;}
   int capacity(){return cap;}
   
   void print(){
   	for(int i=0;i<sz;i++)
   	 cout<<buf[i]<<"   " ;
		cout<<endl; }
   	 
   int& operator[](int i){
   	if(i>=sz)exit(1);
   	return buf[i];}
   	
   void MergeVector(Vector&v1){              //向量v1接到该向量对象后面 
   		int i;
   		for(i=0;i<v1.sz;i++)                 //因为push_back函数中会在容量不够时扩容,所以可以直接使用该函数 
   		push_back(v1.buf[i]);}
   		
	void sort(){                             //该排序函数为升序 
		int min,temp;                        //使用选择排序使该向量有序 
		for(int i=0;i<sz;i++){
			min=i;
			for(int j=i+1;j<sz;j++){
				if(buf[min]>buf[j]) min=j;
				}
			if(min!=i){
				temp=buf[i];
				buf[i]=buf[min];
				buf[min]=temp;
			}
			
		}}
		
		
friend	Vector MergeSort(Vector&v1,Vector&v2);
	
};
Vector::Vector(int n,int v){ //构造含有n个v的向量 
   sz=n;
   cap=4;
   while(sz>=cap) cap*=2;
   buf=new int [cap];
   for(int i=0;i<sz;i++)
    buf[i]=v;}
    
Vector MergeSort(Vector&v1,Vector&v2){
	Vector v;
	v1.sort();v2.sort();
	int t1=0,t2=0;
	int sz1=v1.sz,sz2=v2.sz;
	if(sz1==0) return v2;
	if(sz2==0) return v1;
	
	while(t1<sz1&&t2<sz2){
	if(v1[t1]<=v2[t2]) v.push_back(v1[t1++]);
	else v.push_back(v2[t2++]);}
		
	while(t1<sz1)
	v.push_back(v1[t1++]);
	while(t2<sz2)
	v.push_back(v2[t2++]);
	   
	return v;}
    
    
int main(){
	Vector a(4,6),b(6,1);
//  a.MergeVector(b);
//	a.print();
//	a.push_back(2);
//	a.push_front(22);
//	a.sort();
//	a.print();
    a.push_front(22);
    a.push_back(33);
    a.push_back(44);
    b.insert(3,44);
    b.insert(2,11);
    b.insert(6,2);
    //a.print();
    //a.sort();
    //a.print();
   a.erase(7);
   a.erase(44);
   a.print();
   cout<<"/"<<endl; 
   b.print();
   cout<<"/"<<endl; 
   
   Vector v,c;
   v=MergeSort(a,b);
  // v=MergeSort(a,c);
   v.print();
 
	
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值