C++ Vector源码及其简单实现

C++中的vector是一个动态数组,它在运行时可以调整大小。当需要更多空间时,vector会自动重新分配内存,拷贝现有元素到新内存区域。主要操作包括构造函数(初始化大小和值)、析构函数(释放内存)、push_back(添加元素)、pop_back(移除最后一个元素),以及访问和查询元素的size和capacity。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ vector是一种动态数组,它可以在运行时动态地分配内存空间。它的底层实现是使用指针数组,当数组空间不足时,会重新分配更大的内存空间,并将原有数据复制到新的内存空间中。

以下是C++ vector的一些源码和实现思路:

  1. vector的定义:
template <typename T>
class vector {
public:
    // 构造函数
    vector();
    vector(size_t n);
    vector(size_t n, const T& val);
    vector(const vector& other);
    // 析构函数
    ~vector();
    // 插入和删除元素
    void push_back(const T& val);
    void pop_back();
    // 访问元素
    T& operator[](size_t index);
    const T& operator[](size_t index) const;
    // 获取vector的大小和容量
    size_t size() const;
    size_t capacity() const;
    // 清空vector
    void clear();
    // 判断vector是否为空
    bool empty() const;
private:
    T* m_data;
    size_t m_size;
    size_t m_capacity;
};
  1. vector的构造函数:
template <typename T>
vector<T>::vector() {
    m_data = nullptr;
    m_size = 0;
    m_capacity = 0;
}

template <typename T>
vector<T>::vector(size_t n) {
    m_data = new T[n];
    m_size = n;
    m_capacity = n;
}

template <typename T>
vector<T>::vector(size_t n, const T& val) {
    m_data = new T[n];
    m_size = n;
    m_capacity = n;
    for (size_t i = 0; i < n; i++) {
        m_data[i] = val;
    }
}

template <typename T>
vector<T>::vector(const vector& other) {
    m_data = new T[other.m_capacity];
    m_size = other.m_size;
    m_capacity = other.m_capacity;
    for (size_t i = 0; i < m_size; i++) {
        m_data[i] = other.m_data[i];
    }
}
  1. vector的析构函数:
template <typename T>
vector<T>::~vector() {
    delete[] m_data;
}
  1. vector的push_back函数:
template <typename T>
void vector<T>::push_back(const T& val) {
    if (m_size == m_capacity) {
        // 如果空间不足,重新分配更大的内存空间
        if (m_capacity == 0) {
            m_capacity = 1;
        } else {
            m_capacity *= 2;
        }
        T* new_data = new T[m_capacity];
        for (size_t i = 0; i < m_size; i++) {
            new_data[i] = m_data[i];
        }
        delete[] m_data;
        m_data = new_data;
    }
    m_data[m_size++] = val;
}
  1. vector的pop_back函数:
template <typename T>
void vector<T>::pop_back() {
    if (m_size > 0) {
        m_size--;
    }
}
  1. vector的operator[]函数:
template <typename T>
T& vector<T>::operator[](size_t index) {
    return m_data[index];
}

template <typename T>
const T& vector<T>::operator[](size_t index) const {
    return m_data[index];
}
  1. vector的size和capacity函数:
template <typename T>
size_t vector<T>::size() const {
    return m_size;
}

template <typename T>
size_t vector<T>::capacity() const {
    return m_capacity;
}
  1. vector的clear函数:
template <typename T>
void vector<T>::clear() {
    m_size = 0;
}
  1. vector的empty函数:
template <typename T>
bool vector<T>::empty() const {
    return m_size == 0;
}

参考链接:

  • https://en.cppreference.com/w/cpp/container/vector
  • https://www.geeksforgeeks.org/vector-in-cpp-stl/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值