手写vector

文章展示了如何用C++实现一个简单的vector类模板,包括动态数组、内存管理和基本操作如push_back、pop_back、索引访问、大小和容量查询。代码中包含了内存扩容策略以及析构函数以释放内存。
摘要由CSDN通过智能技术生成

基于C++实现vector

参考代码一

#include <iostream>

template <class T>
class Vector {
private:
    T *arr;
    int capacity;
    int size;

public:
    Vector() : arr(nullptr), capacity(0), size(0) {}

    void push_back(const T &val) {
        if (size == 0) {
            capacity = 1;
            arr = new T[capacity];
        } else if (size == capacity) {
            capacity *= 2;
            T *temp = new T[capacity];

            for (int i = 0; i < size; ++i)
                temp[i] = arr[i];
                
            delete[] arr;
            arr = temp;
        }
        arr[size++] = val;
    }

    void pop_back() {
        if (size > 0)
            --size;
    }

    T& operator[](int idx) {
        return arr[idx];
    }

    const T& operator[](int idx) const {
        return arr[idx];
    }

    int getSize() const {
        return size;
    }

    int getCapacity() const {
        return capacity;
    }

    ~Vector() {
        if (arr != nullptr)
            delete[] arr;
    }
};

int main() {
    Vector<int> vec;
    std::cout << "Pushing back elements...\n";

    for (int i = 1; i <= 10; ++i)
        vec.push_back(i);

    std::cout << "Vector size is: " << vec.getSize() << "\n";
    std::cout << "Vector capacity is: " << vec.getCapacity() << "\n";
    std::cout << "Elements in vector are: ";

    for (int i = 0; i < vec.getSize(); ++i)
        std::cout << vec[i] << " ";

    std::cout << "\nPopping last element...\n";
    vec.pop_back();
    std::cout << "Vector size is: " << vec.getSize() << "\n";
    std::cout << "Vector capacity is: " << vec.getCapacity() << "\n";
    std::cout << "Elements in vector are: ";

    for (int i = 0; i < vec.getSize(); ++i)
        std::cout << vec[i] << " ";

    return 0;
}

//输出:
Pushing back elements...
Vector size is: 10
Vector capacity is: 16
Elements in vector are: 1 2 3 4 5 6 7 8 9 10
Popping last element...
Vector size is: 9
Vector capacity is: 16
Elements in vector are: 1 2 3 4 5 6 7 8 9

在这个代码中,实现了以下操作:

push_back:将新元素添加到向量的末尾。
pop_back:从向量的末尾删除最后一个元素。
操作符[]:允许通过索引访问元素。
getSize:返回向量中元素的数量。
getCapacity:返回向量分配的内部数组的大小。
析构函数:释放内存

参考代码二

为了实现一个C++的vector,我们需要考虑以下几个方面:

数据结构:vector通常是使用动态数组来实现的。因此,我们需要使用一个指针来存储动态数组的地址,并使用一个变量来跟踪vector中元素的数量和容量。

内存管理:vector应该能够动态增长和缩小大小,因此我们需要实现内存管理函数以进行内存分配和释放。

迭代器:vector应该支持迭代器,以便用户可以遍历它的元素。

下面是一个简单的向量实现示例:

#include <iostream>

template<typename T>
class Vector {
public:
    Vector() 
        : m_data(nullptr), m_size(0), m_capacity(0)
    {}

    ~Vector() {
        delete[] m_data;
    }

    void push_back(const T& value) {
        if (m_size >= m_capacity)
            reserve(m_capacity == 0 ? 1 : m_capacity * 2);

        m_data[m_size++] = value;
    }

    void pop_back() {
        if (m_size > 0)
            --m_size;
    }

    T& operator[](size_t index) {
        return m_data[index];
    }

    const T& operator[](size_t index) const {
        return m_data[index];
    }

    size_t size() const {
        return m_size;
    }

    bool empty() const {
        return m_size == 0;
    }

    void clear() {
        m_size = 0;
    }

    void reserve(size_t capacity) {
        if (capacity <= m_capacity)
            return;

        T* newData = new T[capacity];

        for (size_t i = 0; i < m_size; ++i)
            newData[i] = m_data[i];

        delete[] m_data;
        m_data = newData;
        m_capacity = capacity;
    }

private:
    T* m_data;
    size_t m_size;
    size_t m_capacity;
};

int main() {
    Vector<int> vec;

    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    
    std::cout << "遍历结果 :" << std::endl; 
    for (size_t i = 0; i < vec.size(); ++i)
        std::cout << vec[i] << " ";

    vec.pop_back();

    std::cout << "\nvec Size: " << vec.size() << "\n";

    return 0;
}

//输出:
遍历结果 :
1 2 3
vec Size: 2

该示例实现了一个简单的向量类,支持以下操作:

push_back(): 向向量末尾添加元素。
pop_back(): 从向量末尾删除元素。
operator[]: 访问指定位置的元素。
size(): 返回向量中的元素数。
empty(): 如果向量为空,则返回true。
clear(): 删除向量中的所有元素。
reserve(): 更改向量的容量,以便可以存储更多的元素。
注意:此示例不是完整的vector实现。它可能需要进一步优化,并且缺少许多其他vector特性,例如迭代器、插入、删除等操作。

参考代码三

#include <iostream>

using namespace std;

template<typename T>
class Vector {
public:
    Vector():_size(0), _capacity(1) {
        _data = new T[_capacity];
    }

    ~Vector() {
        delete[] _data;
    }

    void push_back(const T& val) {
        if (_size == _capacity) {
            reserve(_capacity * 2);
        }
        _data[_size++] = val;
    }

    void pop_back() {
        --_size;
    }

    bool empty() const {
        return _size == 0;
    }

    size_t size() const {
        return _size;
    }

    size_t capacity() const {
        return _capacity;
    }

    T& at(size_t i) {
        if (i < 0 || i >= _size) {
            throw out_of_range("out of range");
        }
        return _data[i];
    }

    T& operator[](size_t i) {
        return _data[i];
    }

private:
    T* _data;
    size_t _size;
    size_t _capacity;

    void reserve(size_t n) {
        T* new_data = new T[n];
        for (size_t i = 0; i < _size; ++i) {
            new_data[i] = _data[i];
        }
        delete[] _data;
        _data = new_data;
        _capacity = n;
    }
};

int main() {
    Vector<int> vec;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    cout << "遍历结果 :" << endl; 
    for (size_t i = 0; i < vec.size(); ++i) {
        cout << vec[i] << " ";
    }
    cout << endl;
    cout << "弹出vec末尾元素" << endl;
    vec.pop_back();

    cout << "vec访问下标1的元素 :" << endl; 
    cout << vec.at(1) << endl;

    return 0;
}

//输出:
遍历结果 :
10 20 30
弹出vec末尾元素
vec访问下标1的元素 :
20

该程序实现了一个简单的vector,其中包括push_back、pop_back、at、operator[]等常用操作。在数据存储方面,使用了动态数组来实现可变大小,并通过reserve函数来扩充容量。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值