自定义模板类数组

模板类数组

C++练习记录
采用模板类数组,完成基本的自定义vector类的一些基本操作。
notes:模板类的函数实现应该放在定义类的文件中。

#include
 #include 
 using namespace std;
 //***vector类*** 
 template<typename T>
 class myvector{
  public:
   
   myvector();
   myvector(int len,T vec) ;        //填充len长度的元素
   myvector(int len);             //已知长度的情况
   myvector(const myvector<T>& vec);//复制构造 
   ~myvector();
   myvector<T> & operator=(const myvector<T> & vec);//重载赋值运算符 
   T & operator[](int index);           //重载[]运算符 
   void push_back(T ele);               //将元素ele放入数组中 
   template<typename T2>
   friend ostream & operator<<(ostream &out,const myvector<T2>& vec);//重载<<运算符 
   template<typename T3>
   friend istream & operator>>(istream &out,myvector<T3>& vec);//重载>>运算符
      int myfind(const T& ele);     //查找元素 
   void delete_ele(T ele);//删除元素 
   void clear() ; //清空数组 
   protected:
   private:
   int m_len;//元素的实际个数 
      T* m_vec;//用来存放vector 
      int m_cap;//当前数组的大小 
 };
 
 //***默认构造***
 template<typename T>
 myvector<T>::myvector():m_cap(16),m_len(0){ 
  this->m_vec = new T[m_cap];
 }
 
 //***带参构造***
 template<typename T>
 myvector<T>::myvector(int len):m_cap(16)
 { 
     m_cap = len +16;
     m_len = len;
  m_vec = new T[m_cap];
     
 }
 
 //***带参构造*** 
 template<typename T>
 myvector<T>::myvector(int len,T vec):m_cap(16)
 {
  m_cap = len +16;
  m_vec = new T[m_cap];
     m_len = len;
  //1.使用memcpy复制,加头文件cstring 
  //2.使用for复制
  for(int i=0;i<m_len;++i){
  memcpy(&m_vec[i],&vec,sizeof(T));// 相当于m_vec[i] = vec ;//注意,这里会调用重载的赋值运算符 
  } 
  } 
  
 //***重载赋值运算符***
 template<typename T>
 myvector<T> & myvector<T>::operator=(const myvector<T> & vec) 
 {
  if(this == &vec)return *this;
  if(m_vec !=NULL){
   delete[] m_vec;
   m_vec = NULL;
  } 
  m_cap = vec.m_len + vec.m_cap;
  m_len = vec.len;
  m_vec = new T[m_cap];
  memcpy(m_vec,vec.m_vec,sizeof(T)*m_len);
  return *this;
 }
 
 //****重载[]运算符****
 template<typename T>
 T & myvector<T>::operator[](int index)
 {
  if(index<0||index>=m_cap)cerr<<"输入下标不合法!\n";
  return m_vec[index];
  
 }
 
 //***重载<<运算符***
 template<typename T2>
 ostream & operator<<(ostream &out,const myvector<T2>& vec)
 {
  for(int i=0;i<vec.m_len;++i){
   out<<vec.m_vec[i]<<" ";
  }
  out<<endl;
  return out;
 }
 
  //***查找元素***
  template<typename T> 
 int myvector<T>::myfind(const T& ele)
 {  int index = -1;
       for(int i=0;i<m_len;++i){
        if(m_vec[i]==ele)index = i;
    }
    return index;
 }    
  
 //****重载>>运算符****
 template<typename T3>
 istream & operator>>(istream &in,myvector<T3>& vec)
 {   cout<<"输入元素:\n";
  for(int i=0;i<vec.m_len;++i){
   in>>vec.m_vec[i];
  }
  return in;
 }
 //****删除元素****
 template<typename T>  
 void myvector<T>::delete_ele(T ele)
 {   int ind =-1;
     for(int i=0;i<m_len;++i){
        if(m_vec[i]==ele)ind = i;
    }
  if(NULL==m_vec)return;
   
  else if(ind ==-1) return;
  
  else{
   
   T* newvec1 =  new T[m_cap-1];
   for(int i=0;i<ind;++i){
   memcpy(&newvec1[i],&m_vec[i],sizeof(T));
   }
    for(int i=ind;i<m_len-1;++i){
    memcpy(&newvec1[i],&m_vec[i+1],sizeof(T));
   } 
    delete[] m_vec;
      m_vec=newvec1;
      m_len = m_len - 1;
  }
  } 
 
 //***将元素ele放入数组中*** 
 template<typename T>
 void myvector<T>::push_back(T ele)
 {   //将ele放入数组的最后一个位置 
     //1.判断是否为空 
     if(NULL == m_vec){
  m_cap = 16;
  m_len = 0;
  m_vec = new T[m_cap];
     }
     //2.判断数组是否已满,已满则扩容 
     if(m_len==m_cap){
      //扩容:当前容量*2+1
   T* newvec =  new T[m_cap*2+1];
   //把原来的元素拷贝到新空间 
   memcpy(newvec,m_vec,m_len*sizeof(T));
   //释放空间
   delete[] m_vec; 
   m_vec = newvec;   //赋值还原给原数组 
  }
  memcpy(&m_vec[m_len++],&ele,sizeof(T));
 } 
  
 //***清空数组***
 template<typename T>          
 void myvector<T>::clear() 
 {
  m_vec=NULL;
  } 
  
 //***复制构造***
 template<typename T>
 myvector<T>::myvector(const myvector<T>& vec)
 {
   m_cap = vec.m_cap;
   m_len = vec.m_len;
   m_vec = new T[m_cap];
   memcpy(m_vec,vec.m_vec,sizeof(T)*m_len);
 }
 
 //****析构函数*****
 template<typename T>
 myvector<T>::~myvector() 
    {
     cout<<"释放\n";
     delete[] m_vec; 
     
 }

函数的调用
调用格式基本和vector类似

  #include
  #include"myvector.h"
  #include
  using namespace std;
  int main(){
  // myvector vec(10,22);
  //myvector vec1(10,string("CXC"));
   myvector<double>vec2(5);
   //vec1.push_back("张三11") ;
     cin>>vec2;
     vec2.push_back(vec2.myfind(5));
     vec2.delete_ele(3);
     vec2.clear();
   cout<<"vec:"<<vec2<<endl;
   return 0;
  }

你可能感兴趣的:(自定义模板类数组)