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;
}

运行结果

思维导图

相关推荐
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧6 小时前
C++学习:基础知识的掌握
c++·visualstudio
C++ 老炮儿的技术栈12 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
new_zhou12 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
水饺编程14 小时前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
Iruoyaoxh14 小时前
类和对象~
开发语言·c++
程序喵大人14 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法
豆沙沙包?14 小时前
c++中引用(P7-P11)
java·c++·算法
wuminyu14 小时前
虚拟线程底层ForkJoinPool的工作窃取算法机制
java·linux·c语言·jvm·c++
吹什么轩14 小时前
c++复习:c++11:lambda表达式
开发语言·c++
不会代码的小猴14 小时前
标准模板库(STL)
开发语言·c++·笔记·算法