MyVector模拟实现

重要说明

vector 是模板类,Linux 下无法纯分 .h/.cpp(模板分离编译会报错),因此实现放在头文件中,这是 C++ 模板的标准写法。

1.h文件

cpp 复制代码
#ifndef MY_VECTOR_H
#define MY_VECTOR_H

#include <cstddef>
#include <cassert>
#include <utility>
#include <initializer_list>
#include <algorithm>

// 命名空间封装,避免冲突
namespace my_stl
{
    template <class T>
    class vector
    {
    public:
        // 迭代器类型定义(原生指针)
        using value_type      = T;
        using pointer         = T*;
        using const_pointer   = const T*;
        using reference       = T&;
        using const_reference = const T&;
        using iterator        = T*;
        using const_iterator  = const T*;
        using size_type       = size_t;
        using difference_type = ptrdiff_t;

        // ========================= 构造与析构 =========================
        // 默认构造
        vector()
            : _start(nullptr)
            , _finish(nullptr)
            , _end_of_storage(nullptr)
        {}

        // 构造 n 个值为 val 的元素
        explicit vector(size_type n, const T& val = T())
            : _start(nullptr)
            , _finish(nullptr)
            , _end_of_storage(nullptr)
        {
            reserve(n);
            for (size_type i = 0; i < n; ++i)
            {
                push_back(val);
            }
        }

        // 迭代器区间构造
        template <class InputIterator>
        vector(InputIterator first, InputIterator last)
            : _start(nullptr)
            , _finish(nullptr)
            , _end_of_storage(nullptr)
        {
            while (first != last)
            {
                push_back(*first);
                ++first;
            }
        }

        // 初始化列表构造 (C++11)
        vector(std::initializer_list<T> il)
            : vector(il.begin(), il.end())
        {}

        // 拷贝构造(深拷贝)
        vector(const vector& v)
            : _start(nullptr)
            , _finish(nullptr)
            , _end_of_storage(nullptr)
        {
            // 开辟新空间
            pointer tmp = new T[v.capacity()];
            // 拷贝元素
            for (size_type i = 0; i < v.size(); ++i)
            {
                tmp[i] = v._start[i];
            }

            _start = tmp;
            _finish = _start + v.size();
            _end_of_storage = _start + v.capacity();
        }

        // 赋值重载(现代写法:拷贝交换,异常安全)
        vector& operator=(vector v)
        {
            swap(v);
            return *this;
        }

        // 析构函数
        ~vector()
        {
            if (_start)
            {
                delete[] _start;
                _start = _finish = _end_of_storage = nullptr;
            }
        }

        // ========================= 迭代器 =========================
        iterator begin() { return _start; }
        iterator end() { return _finish; }
        const_iterator begin() const { return _start; }
        const_iterator end() const { return _finish; }
        const_iterator cbegin() const { return _start; }
        const_iterator cend() const { return _finish; }

        // ========================= 容量操作 =========================
        size_type size() const { return _finish - _start; }
        size_type capacity() const { return _end_of_storage - _start; }
        bool empty() const { return _start == _finish; }

        // 扩容:只扩不缩,开辟新空间+拷贝+释放旧空间
        void reserve(size_type new_capacity)
        {
            if (new_capacity > capacity())
            {
                size_type old_size = size();
                // 申请新空间
                pointer new_start = new T[new_capacity];
                // 拷贝旧数据(深拷贝)
                for (size_type i = 0; i < old_size; ++i)
                {
                    new_start[i] = _start[i];
                }
                // 释放旧空间
                delete[] _start;

                // 更新指针
                _start = new_start;
                _finish = _start + old_size;
                _end_of_storage = _start + new_capacity;
            }
        }

        // 调整大小
        void resize(size_type new_size, const T& val = T())
        {
            if (new_size < size())
            {
                _finish = _start + new_size;
            }
            else
            {
                reserve(new_size);
                while (_finish < _start + new_size)
                {
                    *_finish++ = val;
                }
            }
        }

        // ========================= 元素访问 =========================
        reference operator[](size_type pos)
        {
            assert(pos < size());
            return _start[pos];
        }

        const_reference operator[](size_type pos) const
        {
            assert(pos < size());
            return _start[pos];
        }

        // 带越界检查
        reference at(size_type pos)
        {
            if (pos >= size())
            {
                throw std::out_of_range("vector out of range");
            }
            return _start[pos];
        }

        const_reference at(size_type pos) const
        {
            if (pos >= size())
            {
                throw std::out_of_range("vector out of range");
            }
            return _start[pos];
        }

        reference front() { return *_start; }
        const_reference front() const { return *_start; }
        reference back() { return *(_finish - 1); }
        const_reference back() const { return *(_finish - 1); }
        pointer data() { return _start; }
        const_pointer data() const { return _start; }

        // ========================= 修改操作 =========================
        // 尾插
        void push_back(const T& val)
        {
            if (_finish == _end_of_storage)
            {
                // 扩容规则:空则4,否则2倍
                reserve(capacity() == 0 ? 4 : capacity() * 2);
            }
            *_finish++ = val;
        }

        // 原位构造 (C++11) 效率更高
        template <class... Args>
        void emplace_back(Args&&... args)
        {
            if (_finish == _end_of_storage)
            {
                reserve(capacity() == 0 ? 4 : capacity() * 2);
            }
            // 直接在容器内构造,避免拷贝
            new (_finish) T(std::forward<Args>(args)...);
            ++_finish;
        }

        // 尾删
        void pop_back()
        {
            assert(!empty());
            --_finish;
        }

        // 插入(处理迭代器失效)
        iterator insert(iterator pos, const T& val)
        {
            assert(pos >= _start && pos <= _finish);
            // 记录偏移量,解决扩容迭代器失效
            size_type len = pos - _start;

            if (_finish == _end_of_storage)
            {
                reserve(capacity() == 0 ? 4 : capacity() * 2);
            }

            // 扩容后更新迭代器位置
            pos = _start + len;
            // 元素后移
            for (iterator it = _finish; it > pos; --it)
            {
                *it = *(it - 1);
            }

            *pos = val;
            ++_finish;
            return pos;
        }

        // 删除(处理迭代器失效)
        iterator erase(iterator pos)
        {
            assert(pos >= _start && pos < _finish);
            // 元素前移
            for (iterator it = pos; it < _finish - 1; ++it)
            {
                *it = *(it + 1);
            }
            --_finish;
            return pos;
        }

        // 清空元素(不释放空间)
        void clear()
        {
            _finish = _start;
        }

        // 交换两个 vector
        void swap(vector& v)
        {
            std::swap(_start, v._start);
            std::swap(_finish, v._finish);
            std::swap(_end_of_storage, v._end_of_storage);
        }

    private:
        pointer _start;          // 数组起始
        pointer _finish;         // 有效元素末尾
        pointer _end_of_storage; // 容量末尾
    };

    // 全局 swap 重载
    template <class T>
    void swap(vector<T>& v1, vector<T>& v2)
    {
        v1.swap(v2);
    }
}

#endif // MY_VECTOR_H

2.main.cpp文件

cpp 复制代码
#include <iostream>
#include "my_vector.h"
using namespace std;

// 测试函数
void test_vector()
{
    cout << "===== 测试 my_vector =====" << endl;

    // 1. 默认构造 + 尾插
    my_stl::vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.emplace_back(40); // C++11 原位构造
    cout << "v1: ";
    for (auto e : v1) cout << e << " ";
    cout << "\nsize: " << v1.size() << " capacity: " << v1.capacity() << endl;

    // 2. 初始化列表构造
    my_stl::vector<int> v2 = {1,2,3,4,5};
    cout << "\nv2: ";
    for (size_t i = 0; i < v2.size(); ++i) cout << v2[i] << " ";
    cout << endl;

    // 3. 拷贝构造
    my_stl::vector<int> v3 = v2;
    cout << "v3(拷贝): ";
    for (auto it = v3.begin(); it != v3.end(); ++it) cout << *it << " ";
    cout << endl;

    // 4. 插入/删除
    auto it = v1.insert(v1.begin() + 1, 99);
    cout << "\n插入后 v1: ";
    for (auto e : v1) cout << e << " ";
    cout << "\n迭代器指向: " << *it << endl;

    it = v1.erase(v1.begin() + 2);
    cout << "删除后 v1: ";
    for (auto e : v1) cout << e << " ";
    cout << "\n迭代器指向: " << *it << endl;

    // 5. 容量调整
    v1.resize(6, 0);
    cout << "\nresize(6)后 v1: ";
    for (auto e : v1) cout << e << " ";
    cout << endl;

    v1.reserve(20);
    cout << "reserve(20)后 capacity: " << v1.capacity() << endl;

    // 6. 清空
    v1.clear();
    cout << "clear后 size: " << v1.size() << " capacity: " << v1.capacity() << endl;
}

// 测试自定义类型
struct Test
{
    int a;
    Test(int x = 0) :a(x) {}
};

void test_custom_type()
{
    cout << "\n===== 测试自定义类型 =====" << endl;
    my_stl::vector<Test> v;
    v.emplace_back(100);
    v.emplace_back(200);
    cout << "自定义类型: " << v[0].a << " " << v[1].a << endl;
}

int main()
{
    test_vector();
    test_custom_type();
    return 0;
}

谢谢

相关推荐
hoiii18715 小时前
matlab基础贝叶斯变换的压缩感知
算法·机器学习·matlab
闻缺陷则喜何志丹15 小时前
P8134 [ICPC 2020 WF] Opportunity Cost|普及+
c++·算法·洛谷
c2385615 小时前
MySrting的模拟实现
开发语言·c++·算法
周杰伦fans15 小时前
DeepSeek 智能效果全景展示
算法
Rabitebla15 小时前
C++ 继承详解(下):默认成员函数、虚继承底层与设计取舍
c语言·开发语言·数据结构·c++·算法·leetcode
爱喝水的鱼丶16 小时前
SAP-ABAP:条件判断与循环控制语句(7篇)第七篇:性能优化:条件与循环代码的常见性能瓶颈与优化方案
学习·算法·性能优化·sap·abap
吃好睡好便好21 小时前
提取矩阵某一行或某一列元素
开发语言·人工智能·线性代数·算法·matlab·矩阵
云泽8081 天前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
ʚ希希ɞ ྀ1 天前
不同路径|| -- dp
算法