c++ 手动实现Myvector

要实现的函数: 构造函数;析构函数;拷贝构造;拷贝赋值;at(); empty();full() ;front(); back(); size(); clear(); expand();  push_back(); pop_back()。

#include <iostream>
#include <cstring>
 
using namespace std;
 
template <typename T>
class Myvector
{
private:
    T *first;
    T *last;
    T *end;
    T data;
    T num;
 
public:
    //无参构造函数
    Myvector() {
        first = nullptr;
        last = first;
        end = first;
    }
 
    //有参构造函数1
    Myvector(T n, T d):data(d), num(n)
    {
        first = new T(n);
        last = first;
        end = first+n;
        for(int i=0; i<n; i++) {
            *last = data;
            last++;
        }
    }
 
    //析构函数
    ~Myvector() {
        delete first;
        first = nullptr;
        delete last;
        last = nullptr;
        delete end;
        end = nullptr;
    }
 
    //拷贝构造
    Myvector(const Myvector &other):first(other.first), last(other.last), end(other.end), data(other.data) {}
 
    //拷贝赋值
    Myvector &operator=(const Myvector &other) {
        this->first = other.first;
        this->last = other.last;
        this->end = other.end;
        this->data = other.data;
 
        return *this;
    }
 
    //at() 访问指定位置的元素
    T &at(int n) {
        T* p = first;
        return *(p+n);
    }
 
    //empty() 判空
    bool empty() {
        return first == last;
    }
 
    //full() 判满
    bool full() {
        return last==end;
    }
 
    //front()返回第一个元素
    T front() {
        return *first;
    }
 
    //back() 返回最后一个元素
    T back() {
        return *(last-1);
    }
 
    //size()  元素数量的大小(元素的个数)
    size_t size() {
        return last-first;
    }
 
    //capacity()  当前所能容纳元素的最大空间
    size_t capacity() {
        return end-first;
    }
 
 
    //clear()  清空所有元素
    void clear() {
        first=last;
    }
 
    //expand()  二倍扩容函数
    void expand() {
        size_t size1 = size();
        if(last==end) {
            T *temp = new T[size1*2];
            memcpy(first, temp, (sizeof(T)*size1));
            delete []first;
            first = temp;
            last = first+size1;
            end = first+(size1*2);
        }
    }
 
    //push_back()  尾插
    void push_back(T r) {
        if(full()) {
            first = new T;
            last = end = first+1;
        }else {
            expand();
        }
        *last = r;
        last++;
    }
 
    //pop_back()  尾删
    void pop_back() {
        last--;
    }
 
 
    //遍历
    void show() {
        for(auto p=first; p!=last; p++) {
            cout<<*p<<"  ";
        }
        cout<<endl;
    }
 
};
 
 
int main()
{
    Myvector<int> m1(8, 5);
 
    Myvector<int> m3;
    m3 = m1;
    m3.show();
 
    cout<<"m1.size = "<<m1.size()<<endl;
 
    m1.show();
 
    cout<<"m1.at(2) = "<<m1.at(2)<<endl;
 
    if(m1.empty()) {
        cout<<"m1为空!"<<endl;
    }else {
        cout<<"m1不为空!"<<endl;
    }
 
    Myvector<int> m2;
    cout<<"m2.size = "<<m2.size()<<"  m2.capacity = "<<m2.capacity()<<endl;
 
    for(int i=0; i<10; i++) {
        m2.push_back(i+1);
        cout<<"m2.size = "<<m2.size()<<"  m2.capacity = "<<m2.capacity()<<endl;
    }
    m2.show();
 
    m1.clear();
    m2.clear();
    m3.clear();
 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值