
c++ 课程设计 模仿C++中的向量模板(vector) 40
一.题目1.模仿C++中的向量模板(vector),设计一个自己的向量模板类MyVector,能够处理不同类型的数据,要求至少能够实现如下功能:1)初始化:(1)MyVe...
一. 题目
1. 模仿C++中的向量模板(vector),设计一个自己的向量模板类MyVector,能够处理不同类型的数据,要求至少能够实现如下功能:
1)初始化:
(1) MyVector <类型说明符> 向量名(长度); //缺省初值为0
(2) MyVector <类型说明符> 向量名(长度,初值);
(3) MyVector <类型说明符> 向量名1(向量2);
(4) MyVector <类型说明符> 向量名1(向量2元素地址1,向量2元素地址2);
2)向量元素的访问:
(1) at函数 格式:向量.at(下标)
(2) [ ]运算符 格式:向量[下标]
作用:返回下标所对应的元素。
3)可以进行的操作:
(1) begin
格式:向量.begin()
作用:得到向量第一个元素的地址。
2) back
格式:向量.back()
作用:得到向量的最后一个元素的值。
(3) capacity
格式:向量.capacity()
作用:得到向量所能容纳元素的总个数。
(4) clear
格式:向量.clear()
作用:删除向量中的所有元素,使向量成为空向量。
(5) empty
格式:向量.empty()
作用:判断向量是否为空,若为空则返回true,否则返回false。
(6) end
格式:向量.end()
作用:返回向量最后一个元素的后继地址。
(7) erase
格式:向量.erase(元素地址);
或 向量.erase(元素地址1,元素地址2);
作用:删除指定地址的元素或指定地址范围[元素地址1,元素地址2)内的元素。注意指定删除的地址不能越界。
(8) front
格式:向量.front()
作用:得到向量第一个元素的值。
(9) insert
格式:向量.insert(元素地址,待插入数据)
或 向量1.insert(元素地址,向量2的元素地址1,向量2的元素地址2)
作用:在向量指定地址之前插入一个数据或插入另一个向量中指定地址范围[元素地址1,元素地址2)的元素,返回新插入的第一个元素的地址。若被插入向量空间不够,则需要增加空间。
(10) pop_back
格式:向量.pop_back()
作用:删除向量的最后一个元素。
(11) push_back
格式:向量.push_back(数据)
作用:在向量最后增加一个元素。
(12) size
格式:向量.size()
作用:得到向量中实际存储元素的数目。
(13) swap
格式:向量1.swap(向量2)
作用:交互向量1和向量2的元素。
(14) =
格式:向量1=向量2
作用:将向量2的元素赋值给向量1。
(15) sort
格式:向量.sor()
作用:将向量中的元素由小到大排序。
将类模板及其函数实现一并定义为头文件,主程序与模板头文件分离 展开
1. 模仿C++中的向量模板(vector),设计一个自己的向量模板类MyVector,能够处理不同类型的数据,要求至少能够实现如下功能:
1)初始化:
(1) MyVector <类型说明符> 向量名(长度); //缺省初值为0
(2) MyVector <类型说明符> 向量名(长度,初值);
(3) MyVector <类型说明符> 向量名1(向量2);
(4) MyVector <类型说明符> 向量名1(向量2元素地址1,向量2元素地址2);
2)向量元素的访问:
(1) at函数 格式:向量.at(下标)
(2) [ ]运算符 格式:向量[下标]
作用:返回下标所对应的元素。
3)可以进行的操作:
(1) begin
格式:向量.begin()
作用:得到向量第一个元素的地址。
2) back
格式:向量.back()
作用:得到向量的最后一个元素的值。
(3) capacity
格式:向量.capacity()
作用:得到向量所能容纳元素的总个数。
(4) clear
格式:向量.clear()
作用:删除向量中的所有元素,使向量成为空向量。
(5) empty
格式:向量.empty()
作用:判断向量是否为空,若为空则返回true,否则返回false。
(6) end
格式:向量.end()
作用:返回向量最后一个元素的后继地址。
(7) erase
格式:向量.erase(元素地址);
或 向量.erase(元素地址1,元素地址2);
作用:删除指定地址的元素或指定地址范围[元素地址1,元素地址2)内的元素。注意指定删除的地址不能越界。
(8) front
格式:向量.front()
作用:得到向量第一个元素的值。
(9) insert
格式:向量.insert(元素地址,待插入数据)
或 向量1.insert(元素地址,向量2的元素地址1,向量2的元素地址2)
作用:在向量指定地址之前插入一个数据或插入另一个向量中指定地址范围[元素地址1,元素地址2)的元素,返回新插入的第一个元素的地址。若被插入向量空间不够,则需要增加空间。
(10) pop_back
格式:向量.pop_back()
作用:删除向量的最后一个元素。
(11) push_back
格式:向量.push_back(数据)
作用:在向量最后增加一个元素。
(12) size
格式:向量.size()
作用:得到向量中实际存储元素的数目。
(13) swap
格式:向量1.swap(向量2)
作用:交互向量1和向量2的元素。
(14) =
格式:向量1=向量2
作用:将向量2的元素赋值给向量1。
(15) sort
格式:向量.sor()
作用:将向量中的元素由小到大排序。
将类模板及其函数实现一并定义为头文件,主程序与模板头文件分离 展开
2个回答
展开全部
#ifndef myvector_h
#define myvector_h
#include<iostream>
using namespace std;
template<typename T>
class MyVector
{
int len;
int s;
T *v;
public:
MyVector<T>(int x)
{
len=x;
s=x;
v=new T[len];
for(int i=0;i<len;i++)
{
v[i]=0;
}
}
MyVector<T>(int x,T y)
{
len=x;
s=x;
v=new T[len];
for(int i=0;i<len;i++)
v[i]=y;
}
MyVector<T>(const MyVector<T>& v2)
{
len=v2.len;
s=v2.s;
v=new T[len];
for(int i=0;i<s;i++)
{
v[i]=v2.v[i];
}
}
MyVector<T>(T*m,T*n)
{
v=m;
int i=int(n-m);
s=len=i+1;
}
T& operator[](int);
T& at(int);
T* begin();
T back();
int capacity();
void clear();
bool empty();
T* end();
void erase(T*);
void erase(T*,T*);
T front();
void insert(T*,T);
T* insert(T*,T*,T*);
void pop_back();
void push_back(T);
int size();
void swap(MyVector&);
MyVector<T>& operator=(const MyVector<T>&);
void sort();
};
template<typename T>
T& MyVector<T>::at(int n)
{
return v[n];
}
template<typename T>
T& MyVector<T>::operator[](int i)
{
return v[i];
}
template<typename T>
T* MyVector<T>::begin()
{
return v;
}
template<typename T>
T MyVector<T>::back()
{
return v[s-1];
}
template<typename T>
int MyVector<T>::capacity()
{
return len;
}
template<typename T>
void MyVector<T>::clear()
{
s=0;
delete []v;
}
template<typename T>
bool MyVector<T>::empty()
{
if(s==0)
return true;
else
return false;
}
template<typename T>
T* MyVector<T>::end()
{
return &v[s-1]+1;
}
template<typename T>
void MyVector<T>::erase(T*m)
{ if(m>=v&&m<=&v[s-1])
{
int i;
for(i=0;i<&v[s-1]-m;i++)
*(m+i)=*(m+1+i);
s--;
}
else
cout<<"超出范围!"<<endl;
}
template<typename T>
void MyVector<T>::erase(T*m,T*n)
{
if(m>=v&&m<=&v[s-1]&&n>=v&&n<=&v[s-1]&&m<n)
{
int i;
for(i=0;i<n-m;i++)
{
*(m+i)=*(n+i);
}
s=s-(n-m);
}
else
cout<<"超出范围!"<<endl;
}
template<typename T>
T MyVector<T>::front()
{
return v[0];
}
template<typename T>
void MyVector<T>::insert(T*m,T x)
{
if(s<len)
{
if(m>=v&&v<=(v+len-1))
{
int n1=m-v,n2=s-n1;
s++;
T *temp=new T[n2];
for(int i=0;i<n2;i++)
temp[i]=*(m+i);
*m=x;
for(int i=0;i<n2;i++)
*(m+1+i)=temp[i];
}
else
{
cout<<"错误!"<<endl;
}
}
else
{
int n1=m-v,n2=s-n1;
len++;
s++;
T *old=v;
v= new T[len];
for(int i=0;i<n1;i++)
*(v+i)=*(old+i);
*m=x;
for(int i;i<n2;i++)
*(m+i+1)=*(old+n1+i);
delete[] old;
}
}
template<typename T>
T* MyVector<T>::insert(T*m,T*n,T*q)
{
if(m>=v&&m<=(v+len-1))
{
int n1=q-n,n2=m-v,i;
if(s+n1>len)
{
T *v2=v;
MyVector v1(s+n1);
v=v1.begin();
for(i=0;i<n2;i++)
*(v+i)=*(v2+i);
for(i=0;i<n1;i++)
*(v+n2+i)=*(n+i);
for(i=0;i<s-n2;i++)
*(v+n1+n2+i)=*(v2+n2+i);
s=len=s+n1;
delete v2;
return v+n2;
}
else
{
T *temp=new T[s-n2];
for(i=0;i<s-n2;i++)
temp[i]=*(m+i);
for(i=0;i<n1;i++)
*(m+i)=*(n+i);
for(i=0;i<s-n2;i++)
*(v+n1+n2+i)=temp[i];
return v+n2;
}
}
else
{
cout<<"错误! "<<endl;
return v;
}
}
template<typename T>
void MyVector<T>::pop_back()
{
s--;
}
template<typename T>
void MyVector<T>::push_back(T x)
{
s++;
T*p;
p=new T[s];
for(int i=0;i<s-1;i++)
p[i]=v[i];
delete v;
v=p;
v[s-1]=x;
}
template<typename T>
int MyVector<T>::size()
{
return s;
}
template<typename T>
void MyVector<T>::swap(MyVector& v0)
{
MyVector temp(v0);
v0=*this;
*this=temp;
}
template<typename T>
void MyVector<T>::sort()
{
for(int i=0;i<s-1;i++)
for(int i=0;i<s-1;i++)
{
int k,j,t;
k=i;
for(j=i+1;j<s;j++)
if(v[k]>v[j])k=j;
if(k!=i)
{t=v[i];v[i]=v[k];v[k]=t;}
}
}
template<typename T>
MyVector<T>&MyVector<T>::operator=(const MyVector<T>&v0)
{
s=v0.s;
len=v0.len;
v=new T[len];
for(int i=0;i<s;i++)
{
v[i]=v0.v[i];
}
return *this;
}
#endif
#define myvector_h
#include<iostream>
using namespace std;
template<typename T>
class MyVector
{
int len;
int s;
T *v;
public:
MyVector<T>(int x)
{
len=x;
s=x;
v=new T[len];
for(int i=0;i<len;i++)
{
v[i]=0;
}
}
MyVector<T>(int x,T y)
{
len=x;
s=x;
v=new T[len];
for(int i=0;i<len;i++)
v[i]=y;
}
MyVector<T>(const MyVector<T>& v2)
{
len=v2.len;
s=v2.s;
v=new T[len];
for(int i=0;i<s;i++)
{
v[i]=v2.v[i];
}
}
MyVector<T>(T*m,T*n)
{
v=m;
int i=int(n-m);
s=len=i+1;
}
T& operator[](int);
T& at(int);
T* begin();
T back();
int capacity();
void clear();
bool empty();
T* end();
void erase(T*);
void erase(T*,T*);
T front();
void insert(T*,T);
T* insert(T*,T*,T*);
void pop_back();
void push_back(T);
int size();
void swap(MyVector&);
MyVector<T>& operator=(const MyVector<T>&);
void sort();
};
template<typename T>
T& MyVector<T>::at(int n)
{
return v[n];
}
template<typename T>
T& MyVector<T>::operator[](int i)
{
return v[i];
}
template<typename T>
T* MyVector<T>::begin()
{
return v;
}
template<typename T>
T MyVector<T>::back()
{
return v[s-1];
}
template<typename T>
int MyVector<T>::capacity()
{
return len;
}
template<typename T>
void MyVector<T>::clear()
{
s=0;
delete []v;
}
template<typename T>
bool MyVector<T>::empty()
{
if(s==0)
return true;
else
return false;
}
template<typename T>
T* MyVector<T>::end()
{
return &v[s-1]+1;
}
template<typename T>
void MyVector<T>::erase(T*m)
{ if(m>=v&&m<=&v[s-1])
{
int i;
for(i=0;i<&v[s-1]-m;i++)
*(m+i)=*(m+1+i);
s--;
}
else
cout<<"超出范围!"<<endl;
}
template<typename T>
void MyVector<T>::erase(T*m,T*n)
{
if(m>=v&&m<=&v[s-1]&&n>=v&&n<=&v[s-1]&&m<n)
{
int i;
for(i=0;i<n-m;i++)
{
*(m+i)=*(n+i);
}
s=s-(n-m);
}
else
cout<<"超出范围!"<<endl;
}
template<typename T>
T MyVector<T>::front()
{
return v[0];
}
template<typename T>
void MyVector<T>::insert(T*m,T x)
{
if(s<len)
{
if(m>=v&&v<=(v+len-1))
{
int n1=m-v,n2=s-n1;
s++;
T *temp=new T[n2];
for(int i=0;i<n2;i++)
temp[i]=*(m+i);
*m=x;
for(int i=0;i<n2;i++)
*(m+1+i)=temp[i];
}
else
{
cout<<"错误!"<<endl;
}
}
else
{
int n1=m-v,n2=s-n1;
len++;
s++;
T *old=v;
v= new T[len];
for(int i=0;i<n1;i++)
*(v+i)=*(old+i);
*m=x;
for(int i;i<n2;i++)
*(m+i+1)=*(old+n1+i);
delete[] old;
}
}
template<typename T>
T* MyVector<T>::insert(T*m,T*n,T*q)
{
if(m>=v&&m<=(v+len-1))
{
int n1=q-n,n2=m-v,i;
if(s+n1>len)
{
T *v2=v;
MyVector v1(s+n1);
v=v1.begin();
for(i=0;i<n2;i++)
*(v+i)=*(v2+i);
for(i=0;i<n1;i++)
*(v+n2+i)=*(n+i);
for(i=0;i<s-n2;i++)
*(v+n1+n2+i)=*(v2+n2+i);
s=len=s+n1;
delete v2;
return v+n2;
}
else
{
T *temp=new T[s-n2];
for(i=0;i<s-n2;i++)
temp[i]=*(m+i);
for(i=0;i<n1;i++)
*(m+i)=*(n+i);
for(i=0;i<s-n2;i++)
*(v+n1+n2+i)=temp[i];
return v+n2;
}
}
else
{
cout<<"错误! "<<endl;
return v;
}
}
template<typename T>
void MyVector<T>::pop_back()
{
s--;
}
template<typename T>
void MyVector<T>::push_back(T x)
{
s++;
T*p;
p=new T[s];
for(int i=0;i<s-1;i++)
p[i]=v[i];
delete v;
v=p;
v[s-1]=x;
}
template<typename T>
int MyVector<T>::size()
{
return s;
}
template<typename T>
void MyVector<T>::swap(MyVector& v0)
{
MyVector temp(v0);
v0=*this;
*this=temp;
}
template<typename T>
void MyVector<T>::sort()
{
for(int i=0;i<s-1;i++)
for(int i=0;i<s-1;i++)
{
int k,j,t;
k=i;
for(j=i+1;j<s;j++)
if(v[k]>v[j])k=j;
if(k!=i)
{t=v[i];v[i]=v[k];v[k]=t;}
}
}
template<typename T>
MyVector<T>&MyVector<T>::operator=(const MyVector<T>&v0)
{
s=v0.s;
len=v0.len;
v=new T[len];
for(int i=0;i<s;i++)
{
v[i]=v0.v[i];
}
return *this;
}
#endif
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2024-10-21 广告
上海华然企业咨询有限公司专注于AI与数据合规咨询服务。我们的核心团队来自头部互联网企业、红圈律所和专业安全服务机构。凭借深刻的AI产品理解、上百个AI产品的合规咨询和算法备案经验,为客户提供专业的算法备案、AI安全评估、数据出境等合规服务,...
点击进入详情页
本回答由上海华然企业咨询提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询