美文网首页
C++实现模板数组

C++实现模板数组

作者: 二进制人类 | 来源:发表于2022-10-26 09:24 被阅读0次

myarray.hpp

#ifndef MYARRAY_HPP
#define MYARRAY_HPP
#include <iostream>
#include <string.h>
using namespace std;
template<class T>
class MyArray
{
    template<typename T1>
    friend ostream& operator<<(ostream &out, MyArray<T1> &ob);
private:
    T *arr;
    int size;
    int capacity;//容量
public:
    MyArray();
    MyArray(int capacity);

    //指针成员必须实现的函数
    MyArray(const MyArray<T> &ob);
    ~MyArray();
    MyArray& operator=(const MyArray &ob);

    //功能函数
    void push_back(T elem);//尾部插入元素
    void pop_back();//尾部删除元素
    T& at(int pos);//取数组的元素
    void sort();//排序


};

template<class T>
MyArray<T>::MyArray()
{
    size = 0;
    capacity=5;

    //获取数组的堆区空间
    arr=new T[capacity];
    //将数组空间 清0
    memset(arr, 0, sizeof(T)*capacity);
}

template<class T>
MyArray<T>::MyArray(int capacity)
{
    size = 0;
    this->capacity=capacity;

    //获取数组的堆区空间
    arr=new T[capacity];
    //将数组空间 清0
    memset(arr, 0, sizeof(T)*capacity);
}

template<class T>
MyArray<T>::MyArray(const MyArray<T> &ob)
{
    cout<<"-----------------"<<endl;
    size=ob.size;
    capacity = ob.capacity;

    //获取数组的堆区空间
    arr=new T[capacity];
    //将数组空间 清0
    memset(arr, 0, sizeof(T)*capacity);

    //将ob数组中元素拷贝过来
    memcpy(arr,ob.arr, sizeof(T)*capacity);
}

template<class T>
MyArray<T>::~MyArray()
{
    if(arr != NULL)
    {
        delete [] arr;
        arr=NULL;
    }
}

template<class T>
MyArray<T> &MyArray<T>::operator=(const MyArray &ob)
{
    //ob2 = ob1;//this代表ob2  ob代表ob1
    //判断ob2是否有指向
    if(arr != NULL)
    {
        delete [] arr;
        arr=NULL;
    }

    size = ob.size;
    capacity = ob.capacity;

    //获取数组的堆区空间
    arr=new T[capacity];
    //将数组空间 清0
    memset(arr, 0, sizeof(T)*capacity);

    //将ob数组中元素拷贝过来
    memcpy(arr,ob.arr, sizeof(T)*capacity);

    return *this;
}

template<class T>
void MyArray<T>::push_back(T elem)
{
    //判断容器是否满
    if(size == capacity)
    {
        //扩容器
        T *tmp = new T[2*capacity];
        memset(tmp,0,sizeof(T)*2*capacity);

        //将原来的数组数据 拷贝过来
        memcpy(tmp,arr,sizeof(T)*capacity);

        //释放原来的空间
        delete [] arr;

        //更新arr的指向
        arr = tmp;

        //更新容量大小
        capacity = 2*capacity;
    }


    arr[size] = elem;
    size++;

    return;
}

template<class T>
void MyArray<T>::pop_back()
{
    //判断容器是否为空
    if(size == 0)
    {
        cout<<"容器没有元素 不允许删除"<<endl;
        return;
    }
    size--;
    return;
}

template<class T>
T &MyArray<T>::at(int pos)
{
    //判断pos有效性
    if(pos<0 || pos >=size)
    {
        cout<<pos<<"位置不合法"<<endl;
        exit(-1);
    }

    return arr[pos];
}

template<class T>
void MyArray<T>::sort()
{
    if(size == 0)
    {
        cout<<"容器为空 不能排序"<<endl;
        return;
    }

    int i=0;
    for(i=0;i<size-1;i++)
    {
        int j = 0;
        for(j=0;j<size-i-1;j++)
        {
            if(arr[j] > arr[j+1])
            {
                T tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1]=tmp;
            }
        }
    }
    return;
}

#endif // MYARRAY_HPP

main.cpp

#include <iostream>
#include <string>
#include "myarray.hpp"
using namespace std;

class Person
{
    friend ostream& operator<<(ostream &out, Person ob);
private:
    int num;
    string name;
public:
    Person(){}
    Person(int num, string name)
    {
        this->num = num;
        this->name = name;
    }
    //重载>
    bool operator>(const Person &ob)
    {
        return num>ob.num;
    }
};

ostream& operator<<(ostream &out, Person ob)
{
    out<<ob.num<<" "<<ob.name<<" ";
    return out;
}

template<typename T1>
ostream& operator<<(ostream &out, MyArray<T1> &ob)
{
    cout<<ob.size<<endl;
    int i=0;
    for(i=0;i<ob.size;i++)
    {
        out<<ob.arr[i]<<" ";
    }
    out<<endl;

    return out;
}
int main(int argc, char *argv[])
{
    MyArray<int> arr1;
    arr1.push_back(20);
    arr1.push_back(30);
    arr1.push_back(50);
    arr1.push_back(10);
    arr1.push_back(40);
    cout<<arr1<<endl;
    arr1.sort();
    cout<<arr1<<endl;

    MyArray<Person> arr2;
    arr2.push_back(Person(103,"lucy"));
    arr2.push_back(Person(101,"bob"));
    arr2.push_back(Person(105,"tom"));
    arr2.push_back(Person(104,"Harry"));

    cout<<arr2<<endl;
    arr2.sort();
    cout<<arr2<<endl;

    return 0;
}

相关文章

  • C++实现模板数组

    myarray.hpp main.cpp

  • C/C++中如何获取数组和指针的长度

    获取数组长度 算术表达式 函数模板参数自动推断 标准C++模板库 模板特化与自动类型推断 Visual C++编译...

  • vector PAT1052

    Vector 是在 java 中可以实现自动增长的对象数组,vector在C++标准模板库中的部分内容,它是一个多...

  • 标准模板库-vector

    标准模板库-vector 1. vector简介 vector为C++的STL中的模板数组容器。在使用时需要包含#...

  • STL标准模板库

    阅读须知: C++语言实现了自定义模板,大家可以自己封装模板. 同样,C++的大牛们已经自己封装了模板库,类似于系...

  • 如何实现自动注册对象Factory

    目标 了解C++里的Factory模式应用场景、实现方法,采用模板实现带来的便利。 来源 A C++ Object...

  • C++的泛型编程

    代码膨胀 C++ 的泛型编程是基于模板实现的,而 C++ 的模板采用的是代码膨胀技术。例如std::list容器,...

  • C++ Tuple元组实现 Metaprogramming

    # C++ Tuple元组实现 Metaprogramming 核心玩法:模板递归、偏特化 template<...

  • 极客班STL与泛型编程(第一周笔记)

    C++模板 什么是泛型编程和模板? 泛型是一种编程思想,而模板是泛型编程在C++上的实现方法 以往的函数都会是有固...

  • 快速排序c与java实现

    java实现 c实现 附加 C++实现 注意标记处,主要为防止超时,可以考虑数组[1, 2]

网友评论

      本文标题:C++实现模板数组

      本文链接:https://www.haomeiwen.com/subject/reqwzrtx.html