C++day7

 仿照vector手动实现自己的myVector,最主要实现二倍扩容功能

代码

头文件

#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <cstring>
#include <vector>
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<T>::begin() //返回第一个数据的地址
{
    return &data[0];
}
template <typename T>
T* Myvector<T>::end() //返回最后一个数据的地址
{
    return &data[number];
}
template <typename T>
T* Myvector<T>::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;
}

运行结果 

思维导图 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值