#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();
}
数据结构-实现向量
最新推荐文章于 2024-07-16 22:26:22 发布