C++的stl库之容器(1)vector 数组

本文详细介绍了C++ STL中的vector容器,包括其作为动态数组的特点、capacity概念、assign拷贝、pop_back、clear、at读取、emplace置位、insert插入、data指针、swap交换、shrink_to_fit最佳适配空间、front和back操作、reserve预留空间、resize改变大小、empty检查空状态、erase擦除以及max_size最大尺寸等操作。通过理解这些概念,有助于深入掌握vector容器的使用。
摘要由CSDN通过智能技术生成


前言

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++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值