模拟实现vector之进阶篇

之前我们实现了一些基本的vector的实现vector基本实现
今天我们在之前的基础上,;模拟实现实现vector中的迭代器
之前写过有关库里面的vector是如何使用的:
链接一://TODO
链接二:vector中扩容函数区别

代码大军如下:

my_vector.cpp

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

//模拟实现vector
template <class T>
class MyVector
{
  public:
    typedef T* Iterator;//用原生指针 类型重定义为 Iterator迭代器 
    typedef const T* const_Iterator;
    MyVector():_start(NULL),_finish(NULL),_end_of_storage(NULL)
    {}
    ~MyVector()
    {
      delete []_start;
      _start=_finish=_end_of_storage=NULL;
    }

    void  PushBack(const T & val)
    {
      //容量不够时就需要扩容
      if(_finish>=_end_of_storage)
      {
        Expand(Capacity()*2+1);
      }
      *_finish=val;
      _finish++;
    }
    void PopBack()
    {
      if(Size()==0)//表示顺序表为空
      {
        return;
      }
      else
      {
        _finish--;
      }
    }
    //*****************对顺序表进行扩容并初始化************************
    void Resize(size_t n ,const T & val=T())
    {
      if(n>Size())
      {
          if(n>Capacity())
          {
            //需要进行扩容
            Expand(n);
          }
          //上面进行扩容后。只是改变了容量
          //并没有改变size
          //然后对size和n之间的元素进行初始化
          //所以要手动的将_finish修改到正确的位置,这样才能保证下面的赋值操作正常进行,否则会段错误的
          _finish=_start+n;
          size_t i=0;
          for(i=Size();i<n;++i)
          {
            _start[i]=val;
          }
      }
      else
      {
        //如果n小于size
        _finish=_start+n;
        //将size减小
      }
    }


    //*****************对顺序表进行赋值************************
    void Assign(size_t n,const T &val= T())
    {
      if(n>Size())
      {
        if(n>Capacity())
        {
          Expand(n);
        }
        _finish=_start+n;
      }
      size_t i=0;
      for(i=0;i<n;++i)
      {
        _start[i]=val;
      }
    }

    //*****************对顺序表进行扩容************************
    void Reserve(size_t n)
    {
      if(n<=Capacity())
      {
        return;
      }
      else
      {
        Expand(n);
      }
    }

    //********************对顺序表进行插入***********************
    Iterator Insert(const Iterator & pos,const T & val)
    {
      assert(pos<=end());//可以进行尾插

      if(_finish==_end_of_storage)
      {
        Expand(Capacity()*2+1);
      }
      _finish++;
      size_t i=0;
      for(i=Size();i>pos-begin();--i)
      {
        _start[i]=_start[i-1];
      }
      *pos=val;
    }
    //**********************对顺序表进行删除***********************

    Iterator Erase(const Iterator& pos)
    {
      assert(pos<end());

      Iterator cur=pos;
      while(cur<end()-1)
      {
        *cur=*(cur+1);
        cur++;
      }
      _finish--;
    }


    T& operator[](size_t pos)
    {
      assert(pos<Size());
      return _start[pos];
    }
    const T& operator[](size_t pos)const
    {
      assert(pos<Size());
      return _start[pos];
    }
    //****迭代器的接口
    Iterator begin()
    {
      return _start;
    }

    Iterator end()
    {
      return _finish;
    }
    const_Iterator begin() const
    {
      return _start;
    }

    const_Iterator end()  const
    {
      return _finish;
    }
    size_t Size()
    {
      return _finish-_start;
    }
    size_t Capacity()
    {
      return _end_of_storage-_start;
    }

  protected:
    Iterator _start;
    Iterator _finish;
    Iterator _end_of_storage;


    void Expand(size_t n)
    {
      if(n<=Capacity())
      {
        return;
      }
      else
      {
        size_t Size=this->Size();
        //注意这里要将Size()先保存下。
        //因为下面在新开的空间后再进行赋值时用到
        T * new_start=new T[n];
        size_t  i=0;
        //对新开的空间进行赋值。
        //这里不用memcpy()是因为T 的如果是自定义类型的话,存在深浅拷贝的问题
        for(i=0;i<Size;i++)
        {
          new_start[i]=_start[i];
        }
        //释放旧的空间
        delete [] _start;
        _start=NULL;

        //修改新空间的三个指针
        _start=new_start;
        _finish=_start+Size;//这里就不可以用Size()函数来求取Size 因为start位置已经变了
        _end_of_storage=_start+n;
      }
    }
};

mian.cpp

#include "my_vector.cpp"

//实现一个打印MyVector的函数
void PrintMyVector(const MyVector<int>& con)
{
  MyVector<int>::const_Iterator  it =con.begin();
  //因为在打印函数中不会修改容器的内容,用const 参数接收
  //那么迭代器也应该是const 的,还要实现了const的begin()和end();
  while(it!=con.end())
  {
    cout<<*it<<" ";
    it++;
  }
  cout<<endl;
}

void test1()
{
  MyVector<int> v1;
  v1.PushBack(1);
  v1.PushBack(2);
  v1.PushBack(3);
  v1.PushBack(4);
  v1.PushBack(5);

  PrintMyVector(v1);
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.PopBack();
  v1.PopBack();
  PrintMyVector(v1);
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Resize(12,8);
  PrintMyVector(v1);
  printf("Resize()会改变size,并且进行初始化\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Resize(3);
  PrintMyVector(v1);
  printf("Resize()会缩小size,但不会改变capacity()\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Reserve(20);
  PrintMyVector(v1);
  printf("Reserve只会改变capacity()\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Reserve(4);
  PrintMyVector(v1);
  printf("Reserve不会缩小容量\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Assign(3,6);
  PrintMyVector(v1);
  printf("Assign对容器进行赋值\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Assign(23,9);
  PrintMyVector(v1);
  printf("Assign会进行扩容,并且会进行多所有元素进行赋值\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

}

void test2()
{
  MyVector<int> v1;
  v1.PushBack(1);
  v1.PushBack(2);
  v1.PushBack(3);
  v1.PushBack(4);
  v1.PushBack(5);

  PrintMyVector(v1);
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Insert(v1.begin()+2,9);
  PrintMyVector(v1);

  v1.Insert(v1.begin()+4,12);
  PrintMyVector(v1);

  v1.Erase(v1.begin()+4);
  PrintMyVector(v1);

  v1.Erase(v1.begin()+2);
  PrintMyVector(v1);


}

int main()
{
  test1();
  test2();
  return 0;
}

执行结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Misszhoudandan/article/details/80723382