一个简单的Vector实现

本文模拟实现了STL中的Vector容器,介绍了其实现细节,并提供了源代码。Vector是一种动态数组,支持快速的随机访问。
部署运行你感兴趣的模型镜像

众所周知,STL库以高效而闻名。而且使用它可以很方便的实现我们的主要逻辑,不需要关心各种底层的实现细节。本文模拟实现了一个简单的vector容器。关于vector的介绍请移步:浅谈STL
代码如下:

#ifndef _VECTOR_
#define _VECTOR_

#include<iostream>
#include<assert.h>
#include<memory.h>
using namespace std;

template<typename T>
class MyVector{
public:
    MyVector()
    {
        _array=new T[1];
        _size=0;
        _capacity=1;
    }
    MyVector(T* arr,size_t size)
    {
        if(arr==NULL)
        {
            MyVector();
            return;
        }
        _array=new T[size];
        int i;
        for(i=0;i<size;++i)
        {
            _array[i]=arr[i];
        }
        _size=size;
        _capacity=size;
    }
    ~MyVector()
    {
        delete[] _array;
        _array=NULL;
        _capacity=0;
        _size=0;
    }
    MyVector(const MyVector<T>& v)
    {
        _capacity=v._capacity;
        _size=v._size;
        _array=new T[this->_capacity];
        memmove(this->_array,v._array,sizeof(T)*this->_size);
    }
    MyVector& operator=(const MyVector<T>& v)
    {
        if(&v!=this)
        {
            T* tmp=new T[this->_capacity];
            memmove(tmp,this->_array,sizeof(T)*this->_size);
            swap(tmp,_array);
            delete[] tmp;
        }
    }
    void push_back(const T& t)
    {
        if(_size==_capacity)
            _Increase(_capacity*2);
        _array[_size++]=t;
    }
    void push_front(const T& t)
    {
        if(_size==_capacity)
            _Increase(_capacity*2);
        memmove(_array,_array+1,sizeof(T)*_size++);
        _array[0]=t;
    }
    void pop_back()
    {
        if(_size>0)
            _size--;
    }
    void pop_front()
    {
        if(_size>0)
            memmove(_array+1,_array,sizeof(T)*--_size);
    }
    T& operator[](size_t pos)
    {
        assert(pos<_size);
        return _array[pos];
    }
    size_t size()
    {
        return _size;
    }
    bool empty()
    {
        return _size<=0;
    }
    void resize(size_t size)
    {
        if(size<=_size)
            return;
        _Increase(size);
        _size=size;
    }
private:
    void _Increase(size_t size)
    {
        if(size<=_capacity)
            return;
        _capacity=size;
        T* tmp=new T[_capacity];
        memmove(tmp,_array,sizeof(T)*_size);
        swap(tmp,_array);
        delete []tmp;
    }
private:
    T* _array;
    size_t _capacity;
    size_t _size;
};
#endif

以上

如果你有任何想法或是可以改进的地方,欢迎和我交流!

完整代码及测试用例在github上:点我前往

本文首发于www.sbrave.cn

【完】

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

在C语言中,没有像C++那样的标准模板库(STL),但我们可以通过手动实现一个动态数组来模拟 `vector` 的功能。以下是一个简单的 C 语言实现的 `vector` 示例,支持基本的添加、删除和访问元素的功能。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int *data; // 指向数据的指针 size_t used; // 当前使用的元素个数 size_t size; // 分配的总空间大小 } Vector; // 初始化向量 void init_vector(Vector *v, size_t initial_size) { v->data = malloc(initial_size * sizeof(int)); v->used = 0; v->size = initial_size; } // 向向量中添加元素 void push_back(Vector *v, int element) { if (v->used == v->size) { v->size *= 2; // 动态扩展容量 v->data = realloc(v->data, v->size * sizeof(int)); } v->data[v->used++] = element; } // 删除最后一个元素 void pop_back(Vector *v) { if (v->used > 0) v->used--; } // 访问向量中的元素 int at(Vector *v, size_t index) { if (index >= v->used) { printf("Index out of bounds\n"); exit(1); } return v->data[index]; } // 获取向量当前大小 size_t get_size(Vector *v) { return v->used; } // 获取向量容量 size_t get_capacity(Vector *v) { return v->size; } // 销毁向量并释放内存 void destroy_vector(Vector *v) { free(v->data); v->data = NULL; v->used = v->size = 0; } int main() { Vector v; init_vector(&v, 4); // 初始容量为4 push_back(&v, 10); push_back(&v, 20); push_back(&v, 30); printf("Vector size: %zu\n", get_size(&v)); printf("Vector capacity: %zu\n", get_capacity(&v)); printf("Element at index 1: %d\n", at(&v, 1)); pop_back(&v); printf("After pop_back, vector size: %zu\n", get_size(&v)); destroy_vector(&v); return 0; } ``` ### 解释 1. **结构体定义**:我们定义了一个 `Vector` 结构体,包含三个成员: - `data`: 指向实际存储数据的数组。 - `used`: 当前已使用的元素数量。 - `size`: 当前分配的数组容量。 2. **初始化函数**:`init_vector` 函数用于初始化向量,并为其分配初始大小的内存。 3. **添加元素**:`push_back` 函数将新元素添加到向量末尾。如果当前容量不足,则通过 `realloc` 扩展容量。 4. **删除元素**:`pop_back` 函数移除向量的最后一个元素。 5. **访问元素**:`at` 函数用于安全地访问向量中的某个元素,防止越界访问。 6. **获取大小和容量**:`get_size` 和 `get_capacity` 分别返回当前使用的元素数量和向量的总容量。 7. **销毁向量**:`destroy_vector` 函数释放向量占用的内存,并将相关字段置零。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值