好的!我们将从零开始模拟实现一个简化版的 vector 容器,重点实现核心功能:动态扩容、元素存取、迭代器支持。以下是分步实现:


1. 框架设计

vector 的核心是一个动态数组,需维护三个关键指针:

  • _start:指向数组首元素
  • _finish:指向最后一个元素的下一个位置
  • _end_of_storage:指向数组容量的末尾
template <typename T>
class vector {
private:
    T* _start;         // 数组起始位置
    T* _finish;        // 有效元素末尾
    T* _end_of_storage; // 容量末尾

public:
    // 构造函数与析构函数
    vector();
    ~vector();

    // 核心接口
    void push_back(const T& value);
    size_t size() const;
    size_t capacity() const;
    T& operator[](size_t pos);
};


2. 构造函数与析构函数

// 默认构造
template <typename T>
vector<T>::vector() 
    : _start(nullptr), _finish(nullptr), _end_of_storage(nullptr) {}

// 析构函数:释放内存
template <typename T>
vector<T>::~vector() {
    delete[] _start;
    _start = _finish = _end_of_storage = nullptr;
}


3. 动态扩容策略

size() == capacity() 时,需重新分配更大内存(通常按2倍扩容):

template <typename T>
void vector<T>::reserve(size_t new_capacity) {
    if (new_capacity <= capacity()) return;

    T* new_start = new T[new_capacity];
    // 迁移旧数据
    for (size_t i = 0; i < size(); ++i) {
        new_start[i] = _start[i];
    }

    // 更新指针
    size_t old_size = size();
    delete[] _start;
    _start = new_start;
    _finish = _start + old_size;
    _end_of_storage = _start + new_capacity;
}


4. 元素操作

push_back 实现
template <typename T>
void vector<T>::push_back(const T& value) {
    if (_finish == _end_of_storage) {
        // 扩容策略:初始为0则分配1,否则2倍扩容
        size_t new_cap = capacity() == 0 ? 1 : capacity() * 2;
        reserve(new_cap);
    }
    *_finish = value; // 拷贝元素
    ++_finish;        // 移动尾指针
}

下标访问
template <typename T>
T& vector<T>::operator[](size_t pos) {
    assert(pos < size());
    return _start[pos];
}


5. 迭代器支持

// 简化版迭代器
template <typename T>
class vector {
public:
    using iterator = T*;
    iterator begin() { return _start; }
    iterator end() { return _finish; }
};


6. 完整代码示例

template <typename T>
class vector {
private:
    T* _start;
    T* _finish;
    T* _end_of_storage;

public:
    vector() : _start(nullptr), _finish(nullptr), _end_of_storage(nullptr) {}

    ~vector() {
        delete[] _start;
        _start = _finish = _end_of_storage = nullptr;
    }

    void reserve(size_t new_capacity) {
        if (new_capacity <= capacity()) return;
        T* new_start = new T[new_capacity];
        for (size_t i = 0; i < size(); ++i) {
            new_start[i] = _start[i];
        }
        size_t old_size = size();
        delete[] _start;
        _start = new_start;
        _finish = _start + old_size;
        _end_of_storage = _start + new_capacity;
    }

    void push_back(const T& value) {
        if (_finish == _end_of_storage) {
            size_t new_cap = capacity() == 0 ? 1 : capacity() * 2;
            reserve(new_cap);
        }
        *_finish = value;
        ++_finish;
    }

    size_t size() const { return _finish - _start; }
    size_t capacity() const { return _end_of_storage - _start; }

    T& operator[](size_t pos) {
        return _start[pos];
    }

    using iterator = T*;
    iterator begin() { return _start; }
    iterator end() { return _finish; }
};


7. 测试用例

#include <iostream>
int main() {
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " "; // 输出: 1 2 3
    }
    return 0;
}


关键点总结

  • 动态扩容:通过 reserve() 实现内存翻倍策略。
  • 深拷贝:扩容时需迁移旧数据,避免浅拷贝。
  • 迭代器:直接使用指针简化实现。
  • 异常安全:实际STL还需处理构造/析构异常(此处简化)。

可根据需求继续扩展 pop_back()insert()erase() 等功能。

更多推荐