STL浅谈(一)——vector

在C++中,STL (Standard Template Library)是必学,也是非常重要的一块内容。STL为特定场景的数据保存提供了极大的方便。同时STL也是面试官必问的问题之一。STL有着高可重用性,高性能,高移植平台和跨平台的优点。这篇博客叫STL浅谈,因为STL涉及到的内容太多了,这里只能随便介绍介绍。

  1. STL的构成

STL主要由六大块构成:

  • 容器:用于存储数据的工具,例如:vector,list,deque, set,map等
  • 算法:实现了按照用户的要求对容器中数据进行特定的操作,例如sort,find,copy以及遍历等
  • 迭代器:通过迭代器可以访问工具中的特定数据
  • 仿函数:协助算法完成不同的策略,例如排序算法就需要加入指定的仿函数(从小到大还是从大到小排序)。
  • 适配器:用来修饰容器或者仿函数或迭代接口的东西
  • 空间适配器:负责空间的配置与管理
  1. STL中的vector
    这篇博客主要就是用于介绍一下vector的底层实现原理以及其中的各种坑点。

vector的底层实现其实是一个数组。vector实现了变长数组的功能,它就像数组一样,可以通过索引随机访问,但是由于数据安全,向vector中随机插入元素的效率便显得比较低下。除此之外,vector还向外提供了一个size的概念,即返回当前的vector中有多少个元素。同时还有一个capacity的概念,即返回当前的vector的容量。这一变量一般由系统自动分配,调用reverse后可以认为的改变其capacity的大小。

  1. 通过代码写一个MyVector类自主实现vector这一容器
    由于vector能够存储不同类型的数据,因此vector需要通过模板类来实现:
class MyVector{
   
        T* elements;  //指向动态数组的指针
        int count;  //记录添加进数组的元素个数
        int capacity; //记录vector的容量
};

以上的几个数据便实现了一个vector,但是vector的强大之处并不是这几个简单的数据,而是其拥有强大的接口,下面的代码实现了一些常用的接口:

#include<stdio.h>

//定义一个自己的名空间,避免和std中的ector的关键字冲突
namespace mySTL{
   
    template<typename T>
    class MyVector{
   
        T* elements;  //指向动态数组的指针
        int vecSize;  //记录添加进数组的元素个数
        int vecCapacity; //记录vector的容量

    public:
        //默认构造函数
        MyVector();
        //拷贝构造
        MyVector(MyVector<T>& arr);
        //传数组,同时指定长度的构造
        MyVector(MyVector<T>& arr, int startIndex, int endIndex);

        //析构函数
        ~MyVector();

        //将元素添加到vector中
        void push_back(T element);

        //弹出vector中的最后一个元素
        void pop_back();
        
        //获取当前的数据元素个数
        int size()const{
   
            return this->vecSize;
        }

        //获取当前的vector的容量
        int capacity()const{
   
            return this->vecCapacity;
        }

        //改变当前的vector的容量
        void reserve(int newCapacity);

        //改变当前元素的个数
        void resize(int newSize);

        //重载改变当前元素个数的方法,涉及到默认值
        void resize(int newSize, const T& element);

        //改写[]符号,支持随机访问
        T& operator[](int index);

        //判断当前的vector是为空
        bool empty(){
   
            return 0 == this->vecSize;
        }

    private:
        //设置一个内部方法,当现有空间不足时申请一块新的空间,内部方法用__开头
        void __realloc(int newCapacity);
    };

    //默认构造函数
    template <typename T>
    MyVector<T>::MyVector(){
   
        //默认给一个初始容量
        this->vecCapacity = 5;
        this->vecSize = 0;
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值