STL--手撕一个简单的vector

我们的最简单的vector要实现以下的一些功能

push_back
pop_back
[]
iterator_begin
iterator_end

下面的程序简单的实现了一个vector,只是简单的实现,并不涉及到一些高级功能,我们的模板如下

#include <iostream>
#include <cstring>

using namespace std;
template<typename T>
class MyVector
{
public:
    MyVector(int len = 0):max_len(len), m_Date(nullptr), pos(0) {
        if (len > 0) {
            // 创建一个数组
            m_Date = new T[len];
            memset(m_Date, 0, sizeof(m_Date) * len);
        }
        else {
            // 默认创建的数组长度为20
            max_len = 20;
            m_Date = new T[max_len];
            memset(m_Date, 0, sizeof(m_Date) * max_len);
        }
    };

    ~MyVector(){
        delete[] m_Date;
    }

    void push_back(const T& v) {
        // vector 小于数组的最大长度
        if (pos < max_len) {
            m_Date[pos] = v;
        }
        // 否则的话需要扩容
        else {
            T* new_Date = new T[2 * max_len + 1];
            for (int i = 0;i < max_len;i++) {
                new_Date[i] = m_Date[i];
            }
            new_Date[pos] = v;
            delete[] m_Date;
            m_Date = new_Date;
            max_len = 2 * max_len + 1;
        }
        ++pos;

    }

    T pop_back() {
        --pos;
        return m_Date[pos];
    }

    int size() {
        return this->pos;
    }

    T* begin() {
        return this->m_Date;
    }

    T* end() {
        return this->m_Date + pos;
    }

    T operator[](int n) {
        if (n < pos) {
            return m_Date[n];
        }
        cout << "out of memery!" << endl;
        return T();
    }

protected:
    T* m_Date;
    int max_len;
    int pos;
};


我们的测试代码如下

int main() {
    MyVector<int> v(2);
    // 测试vector的添加元素和扩容
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    // 测试迭代器
    for (int* iter = v.begin();iter != v.end();++iter) {
        cout << *iter << endl;
    }
    // 测试删除元素
    cout << v.pop_back() << endl;
    // 测试直接提取元素
    cout << v[0] << endl;
    // 测试返回vector的长度
    cout << v.size() << endl;
    return 0;
}

得到的结果如下

1
2
3
4
1
out of memery!
0
4
3
2
1
pos is litter than 00
-1

可见简单的vector可以实现简单的功能,我们只需要掌握泛型编程的精髓就好,不要在一些细枝末节上花费太多时间,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值