C++实现简单的Vector

记录一下用C++实现简单的Vector

最近刷面经看到了一个要实现vector类的 然后就试了下
后面还有一篇实现share_ptr的

实现my_vector类

#include<iostream>
#include <initializer_list>

template<class T>
class my_vector {
public:
    //使用初始化列表的构造函数
    //列表容量就是我们vector的大小(size),容量可以给一个初始值,这里我用的还是列表的大小
    my_vector(const std::initializer_list<T>& r) :size(r.size()),volume(r.size()) {
        ptr = new T[volume];
        T* p = ptr;

        //复制列表元素到我们的vector里面
        for (T it : r) {
            *(p++) = it;
        }
    }
    //无参的构造函数 这里容量给了默认值10 也可以#define一个值放这里
    my_vector() :size(0),volume(10) {
        ptr = new T[volume];
    }

    //含参的构造函数 我猜想容量应该为2^n 所以计算了一下
    my_vector(size_t _size) :size(_size) {
        volume =max((int)pow(2, ceil(log2(size))),10);
        ptr = new T[volume];
    }
    //释放容器
    ~my_vector() {
        delete[] ptr;
        ptr = nullptr;
    }

    //返回起始地址和终止地址
    //实现begin() 和end()后可以用for遍历
    T* begin() {
        return ptr;
    }
    T* end() {
        return ptr + size;
    }

    size_t Size() { return size; }
    size_t Volume() { return volume; }
    
    //重载[]实现下标存取
    //判断数组越界
    T& operator[](int i) {
        
        try {
            if (i >= size || i < 0) {
                throw i;
            }
            return *(ptr + i);

        }
        catch (int e) {
           
        }
    }

    //在push_back的时候判断是否需要扩容
    void push_back(T val) {

        if (size >= volume) {
            std::cout << "扩容!!!\n";
            volume *= 2;
            T* tmp = ptr;
            //先扩容,后拷贝,然后删除
            ptr = new T[volume];
            for (int i = 0; i < size; i++) {
                *(ptr + i) = *(tmp + i);
            }
            delete[] tmp;
            tmp = nullptr;
        }
        //向末尾添加元素并增加size
        
        *(ptr + size) = val;
        size++;
        //std::cout << *(ptr + size - 1) << std:: endl;
    }


private:
    T* ptr;
    size_t size;
    size_t volume;
};

测试my_vecotr


template<typename T>
void printArr(my_vector<T>& arr) {
//因为my_vector实现了begin(),end()
    for (T it : arr) {
        cout << it << " ";
    }
    cout << endl;
}

//简单写了个快排来测试(bushi)
//好吧也是复习的。。。
template<typename T, typename F>
void Quicksort(my_vector<T>& arr, F cmp, int begin = 0, int end = -2) {
    if (end == -2)end = arr.Size() - 1;
    if (begin >= end)return;

    int l = begin, r = end;
    int k = l;

    while (l < r) {
        while (cmp(arr[k], arr[r]) && l < r)r--;
        while (cmp(arr[l], arr[k]) && l < r)l++;
        swap(arr[l], arr[r]);
    }
    swap(arr[l], arr[k]);

    Quicksort(arr, cmp, begin, l - 1);
    Quicksort(arr, cmp, l + 1, end);


}

int main() {
    my_vector<int> arr { 4,2,5,7,10 };
    Quicksort(arr, [](int a, int b) {return a >= b; });
    printArr(arr);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值