在C++中,STL (Standard Template Library)是必学,也是非常重要的一块内容。STL为特定场景的数据保存提供了极大的方便。同时STL也是面试官必问的问题之一。STL有着高可重用性,高性能,高移植平台和跨平台的优点。这篇博客叫STL浅谈,因为STL涉及到的内容太多了,这里只能随便介绍介绍。
- STL的构成
STL主要由六大块构成:
- 容器:用于存储数据的工具,例如:vector,list,deque, set,map等
- 算法:实现了按照用户的要求对容器中数据进行特定的操作,例如sort,find,copy以及遍历等
- 迭代器:通过迭代器可以访问工具中的特定数据
- 仿函数:协助算法完成不同的策略,例如排序算法就需要加入指定的仿函数(从小到大还是从大到小排序)。
- 适配器:用来修饰容器或者仿函数或迭代接口的东西
- 空间适配器:负责空间的配置与管理
- STL中的vector
这篇博客主要就是用于介绍一下vector的底层实现原理以及其中的各种坑点。
vector的底层实现其实是一个数组。vector实现了变长数组的功能,它就像数组一样,可以通过索引随机访问,但是由于数据安全,向vector中随机插入元素的效率便显得比较低下。除此之外,vector还向外提供了一个size的概念,即返回当前的vector中有多少个元素。同时还有一个capacity的概念,即返回当前的vector的容量。这一变量一般由系统自动分配,调用reverse后可以认为的改变其capacity的大小。
- 通过代码写一个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;