文章目录
前言
STL 即 Standard Template Library,中文可译为标准模板库,是C++自带的模板库,是ANSI/ISO C++标准的一部分,不需要安装其它部件,就可以直接使用。
STL主要由容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分组成。
本文主要介绍其中的容器(containers)部分,其它的有时间再说。
一、容器是什么?
在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。
简而言之,容器是一种类,即一种数据结构,其中包含数据结构和针对该数据结构的相关算法。
容器是面对对象的,容器实现了数据操作和数据结构的分离,使得代码的变得更加通用,常在力扣等算法竞赛中出现。
二、vector容器
1.简介
vector是一个线性顺序结构的数据结构,相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。
vector存储的数据在内存中是连续的一串数据,每个数据元的大小固定,依次排序。建立时,使用malloc向系统申请一段连续的内存,大小为capacity*(数据长度),其中capacity是默认值。 而改变时,需要重新申请更大的连续内存空间,再把原空间的数据深拷贝(即把实体整个复制)过去,所以如果改变的次数较多,会影响运行的效率。
vector的内存管理并不归还数据给系统,申请了的空间依然保留,调用release函数时,并不调用free函数,只是标记该内存空间的数据无效。这样做一是为了避免内存碎片,二是提高了内存申请和释放的效率——不用每次都在系统内存里寻找一番。
故读取已知位置的数据的时间复杂度为O(1),在末尾插入数据的时间复杂度为O(1),在中间插入数据的时间复杂度为O(n)。
class vector{
int *p;
//以后的举例都使用的vector<int>作为例子,也可以使用其它数据类型或者数据结构
int size=0;
int capacity=0;
p=(*int)malloc(capacity*sizeof(int));
}
vector<int>V;//使用例子,以后的使用也用V代替数值为int型的vector容器
int res=V[0];//把动态数组0号位置的值赋给res
2.capacity容量
vector的容量是可以不断扩充的,不同的编译器扩充倍数并不相同。
vector的初始容量若无初始化,则为0,若初始化则为初始化时候的数据数量。如果对vector进行修改,比如push_back,若修改后大小超过capacity则容量按扩充倍数增长。(特别的,对vector进行第一次修改时,容量大小和修改后的容量大小相同)
int capacity=0;
3.assign拷贝
用法一
即将现有的动态数组V,使之成为另一个动态数组的部分或全部的复制。
复制时,若复制的元素数量不超过动态数组V的上线,则capacity不改变。若复制元素的数量超出动态数组V的上限,则capacity变为被复制数组的size,即元素的数量。同理,等号可以看成一个全体复制的assign。
void assign(vector<int>::iterator begin,vector<int>::iterator end){
V.clear();
for(vector<int>::iterator i=begin;i<end;i++){
V.push_back(*i);
//实际上并不是使用的push_back(),因为这样要经常修改V的capacity大小
}
}、
vector<int>W;//需要被拷贝的数组
V.assign(W.begin(),W.end());//将W整体拷贝到V里面
//因为是硬拷贝时间复杂度为O(n)
用法二
将一个数据的n个复制,赋值给这个数组,原理同上。
void assign(int n,int W){
V.clear();
for(int i=0;i<n;i++