STL--手撕一个简单的vector

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

push_back
pop_back
[]
iterator_begin
iterator_end

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

#include 
#include 

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

你可能感兴趣的:(c++,c++,开发语言,算法)