- #ifndef TEST_H
- #define TEST_H
- #include
- #include
- #include
- using namespace std;
- template <typename T>
- class Myvector
- {
- public:
- Myvector(); //无参构造
- Myvector(int n,const T num); //有参构造
- Myvector(const Myvector &other);//拷贝构造
- ~Myvector(); //析构函数
- int capacity(); //返回当前所能容纳的元素个数
- void push_back(const T &num); //在末尾插入元素
- int size_data(); //返回当前存储的元素个数
- void assign(int n,const T num); //向容器中赋值
- T& at(int pos); //返回指定位置的数据
- void clear(); //清空
- bool empty(); //判空
- T& front(); //返回第一个数据
- T& back(); //返回最后一个数据
- T* begin(); //返回第一个数据的地址
- T* end(); //返回最后一个数据的地址
- T* insert(T* p,const T& num); //指定位置插入数据
- void pop_back(); //删除最后一个数据
- void show(); //遍历
- private:
- T* data; //存数据
- int size; //存储数据个数最大值
- int number; //存储当前数据个数
- };
- #endif // TEST_H
- #include "test.h"
- template <typename T>
- Myvector<T>::Myvector():data(new T),size(1),number(0){} //无参构造
- template <typename T>
- Myvector<T>::Myvector(int n,const T num) //有参构造
- {
- //输入了n个数据
- size = n;
- number = n;
- data = new T[n];
- for (int i = 0; i < n; ++i) //将申请到的空间都赋值为num
- {
- data[i] = num;
- }
- }
- template <typename T>
- Myvector<T>::Myvector(const Myvector &other)//拷贝构造
- {
- size = other.size;
- data = new T[other.size];
- for (int i = 0; i < other.size; ++i)
- {
- data[i] = other.data[i];
- }
- }
- template <typename T>
- Myvector<T>::~Myvector() //析构函数
- {
- delete []data;
- }
- template <typename T>
- int Myvector<T>::capacity() //返回当前所能容纳的元素个数
- {
- return size;
- }
- template <typename T>
- void Myvector<T>::push_back(const T &num) //在末尾插入元素
- {
- if(number == size) //判断当前是否已满
- {
- int i = 0;
- T* data_new = new T[size*2]; //二倍扩容
- size = size * 2;
- while(i < number) //将旧区的数据内容赋给新区
- {
- data_new[i] = data[i];
- i++;
- }
- delete []data; //释放旧区
- data = data_new; //指向新区
- data_new = nullptr; //新指针置空
- data[number] = num; //插入元素
- number++; //存储数量加1
- }
- else if(number < size)
- {
- data[number] = num;
- number++;
- }
- }
- template <typename T>
- int Myvector<T>::size_data() //返回当前存储的元素个数
- {
- return number;
- }
- template <typename T>
- void Myvector<T>::assign(int n,const T num) //向容器中赋值
- {
- if(n > size) //判断要重写的数据个数是否最大存储个数
- {
- int i = 0;
- while(n > size)
- { //之前的空间不够,释放并重新给空间
- delete []data;
- data = nullptr;
- data = new T[size*2]; //二倍扩容
- size = size * 2;
- }
- while(i < n) //循环赋值
- {
- data[i] = num;
- i++;
- }
- number = n; //存储数量改变
- }
- else if(n < size)
- {
- int i = 0;
- while(i < n) //循环赋值
- {
- data[i] = num;
- i++;
- }
- if(n > number) //如果重写个数大于已有个数
- {
- number = n; //更新已有个数
- }
- }
- }
- template <typename T>
- T& Myvector<T>::at(int pos) //返回指定位置的数据
- {
- if(pos > number || pos < 0)
- {
- throw T(1); //抛出异常
- }
- else
- {
- return data[pos-1]; //返回指定位置数据
- }
- }
- template <typename T>
- void Myvector<T>::clear() //清空
- {
- memset(data,0,sizeof(data[0])*size);
- number = 0;
- }
- template <typename T>
- bool Myvector<T>::empty() //判空
- {
- return number == 0;
- }
- template <typename T>
- T& Myvector<T>::front() //返回第一个数据
- {
- return data[0];
- }
- template <typename T>
- T& Myvector<T>::back() //返回最后一个数据
- {
- return data[number-1];
- }
- template <typename T>
- T* Myvector
::begin() //返回第一个数据的地址 - {
- return &data[0];
- }
- template <typename T>
- T* Myvector
::end() //返回最后一个数据的地址 - {
- return &data[number];
- }
- template <typename T>
- T* Myvector
::insert(T* p,const T& num) //指定位置插入数据 - {
- int j = 0;
- while(&data[0]+j != p) //寻找输入的是第几个数据的地址
- {
- j++;
- }
- if(number == size || j+1 > size) //判断当前是否已满
- {
- int i = 0;
- T* data_new = new T[size*2]; //二倍扩容
- size = size * 2;
- while(i < number) //将旧区的数据内容赋给新区
- {
- data_new[i] = data[i];
- i++;
- }
- delete []data; //释放旧区
- data = data_new; //指向新区
- data_new = nullptr; //新指针置空
- //将指定位置之后的数据全都后移一位
- for(int k = number,i = j;i < number;i++,k--)
- {
- data[k] = data[k-1];
- }
- data[j] = num; //插入元素
- number++; //存储数量加1
- return &data[j];
- }
- else if(number < size && j < size)
- {
- //将指定位置之后的数据全都后移一位
- for(int k = number,i = j;i < number;i++,k--)
- {
- data[k] = data[k-1];
- }
- data[j] = num; //插入元素
- number++; //存储数量加1
- return &data[j];
- }
- }
- template <typename T>
- void Myvector<T>::pop_back() //删除最后一个数据
- {
- number--;
- }
- template <typename T>
- void Myvector<T>::show() //遍历
- {
- int i = 0;
- for(;i < number;i++)
- {
- cout << data[i] << "\t";
- }
- cout << endl;
- }
- #include "test.h"
- #include "test.cpp"
- int main()
- {
- Myvector<int> v1(6,3);
- v1.show();
- cout << "1当前能够容纳的元素个数:" << v1.capacity() << endl;
- v1.push_back(5); //在末尾插入一个数
- v1.show();
- cout << "最后一个元素:" << v1.at(7) << endl;
- cout << "2当前能够容纳的元素个数:" << v1.capacity() << endl;
- cout << "第一个数:" << v1.front() << endl;
- cout << "最后一个数:" << v1.back() << endl;
- v1.insert(v1.begin()+3,5); //指定位置插入
- v1.show();
- cout << "3当前能够容纳的元素个数:" << v1.capacity() << endl;
- v1.pop_back(); //删除末尾元素
- v1.show();
- cout << "4当前能够容纳的元素个数:" << v1.capacity() << endl;
- v1.assign(13,1); //向容器中赋值
- v1.show();
- cout << "5当前能够容纳的元素个数:" << v1.capacity() << endl;
- return 0;
- }

