• 理论STL——vector篇(小Z 著)


    目录

    课前唠一唠

    学习过程

    vector的定义

    方法

    vector的访问

    vector的常用函数

    小结


    课前唠一唠

    OK,大家好,我又来啦,那么这期讲一下C++的一个知识点——vector……

    学习过程

    C++功能强大,为开发者提供了标准模板库(standard template library,STL),其中封装了很多实用的容器。容器可以理解成能够实现很多功能的系统函数,或者说是一种用来存放数据的对象,开发者可以根据接口规范(调用格式)直接调用,而不用关心其内部实现的原理和具体代码,十分方便快捷。常见的容器有vector,stack,queue,map,set等……

    vector直接翻译为“向量”,一般说成“变长数组”,也即“长度根据需要而自动改变的数组”。在信息学竞赛中,有些题目需要定义很大的数组,这样会出现“超出内存限制”的错误。比如,如果一个图的顶点太多,使用邻接矩阵就会超出内存限制,使用指针实现邻接表又很容易出错,而使用vector实现简洁方便,还可以节省存储空间。

    使用vector,首先需要添加vector头文件,即include,同时,必须要有“using namespace std”。

    vector的定义

    方法

    vector<typename> name;

    以上定义相当于定义了一个一维数组name[size],只是size不确定,其长度可以根据需要而变化。其中,typename可以是任何基本类型,如int,double,char,结构体等,也可以是STL标准容器,如vector,queue等。例如:

    1. vector<int> a;
    2. vector<double> score;
    3. vector stu;//node为已经定义了的结构体

    但是,如果typename也是一个STL容器,那么定义时需要在两个“>”的符号之间加上一个空格,因为“>>”在C++11标准之前的编译器里会作为“移位”操作,从而导致编译错误。例如:

    vectorint> > a;

    这个格式很容易让人想起二维数组的定义,即一个一维数组的每一个元素又是一个一维数组。对于多维数组,vector操作的核心思想就是“高维向低维转化”。例如:

    1. vector<int> v[100];//定义一个一维长度已经固定为100的二维数组,另外一维长度不固定
    2. vectorint> > a;//定义一个两个维度长度都可变的二维数组

    vector的访问

    访问vector中的元素一般有两种方式。

    第一种是通过“下标”访问。例如,对于容器vector v,可以使用v[index]来访问它的第index个元素。其中,0<=index<=v.size()-1.size()表示vector中元素的个数。

    第二种方式是通过“迭代器”访问。可以将迭代器(iterator)理解为一种类似指针的变量。其定义为:

    vector<typename>::iterator it;

    这样,it就是一个vector::iterator型的变量。例如:

    vector<int>::iterator it;

    就是定义一个迭代器it,并且通过“*it”来访问int类型的vector里的元素。例如:

    1. vector<int>::iterator it= v.begin();//v.begin()为取v的首元素地址,而it指向这个地址,相当于v[0]。v[i]和*(v.begin()+i)是等价的
    2. forint i=0;i<=5;i++) printf("%d",*(it+i));//输出v[i]

    在常用的STL容器中,只有vector和string允许使用“v.begin()+3”这种迭代器加上整数的写法。同时,迭代器也可以进行自加,自减操作,即it++,++it,it--和--it。例如:

    1. for(vector<int>::iterator it = v.begin();it!=v.end();it++)
    2. printf("%d",*it);//输出v[i]

    需要注意的是:v.end()并不是取v的尾元素地址,而是尾元素地址的下一个地址,作为迭代器末尾标志不存储任何元素。

    vector的常用函数

    前面已经介绍了两个vector函数:begin()和end()。需要注意的是,这是一种“左闭右开”的表示方法。下面介绍其他几个常用的vector函数。

    (1)push_back():push_back(x)用来在vector后面添加一个元素x,时间复杂度为0(1)。

    (2)size():如果是一维数组,size()用来获得vector中元素的个数;如果是二维数组,size()用来获得vector中第二维的元素个数,时间复杂度为0(1)。同时,还可以使用resize(n)重设数组的大小。例如,以下一段代码输出“12300”。

    1. vector<int> v;
    2. forint i = 1;i <= 3;i++) v.push_back(i);
    3. v.resize(5);
    4. forint i = 0;i < v.size;i++) printf("%d",v[i]);

    (3)pop_back():pop_back()用来删除vector的尾元素,时间复杂度为0(1)。例如,以下代码段输出“12”。

    1. vector<int> v;
    2. forint i = 1;i <= 3;i++) v.puch_back(i);
    3. v.pop_back();
    4. forint i = 0;i < v.size();i++) printf("%d",v[i]);

    (4)clear():clear()用来清空vector中的所有元素,时间复杂度为0(n),其中n为vector中元素的个数。例如,以下一段代码输出“0”。

    1. vector<int> v;
    2. forint i = 1;i <= 3;i++) v.push_back(i);
    3. v.clear();
    4. printf("%d",v.size());

    (5)insert():insert(it,x)用来向vector任意迭代器it处插入一个元素x,时间复杂度为0(n)。例如,以下一段代码输出“1 2 -1 3 4 5”。

    1. vector<int> v;
    2. forint i = 1;i <= 5;i++) v.push_back(i);
    3. v.insert(v.begin()+2-1);//将-1插入到v[2]处
    4. forint i = 0;i < v.size();i++)printf("%d",v[i]);

    (6)erase():erase()用来删除vector中的元素,有两种方法。一种是erase(it),删除迭代器it处的元素;另一种是erase(first,last),删除左闭右开区间[first,last)内的所有元素。例如,以下一段代码输出“1 5”。

    1. vector<int> v;
    2. forint i = 1;i <= 5;i++) v.push_back(i);
    3. v.erase(v.begin()+1,v.begin()+4);//删除v[1],v[2],v[3]
    4. forint i = 0;i < v.size();i++)printf("%d",v[i]);

    小结

    这节课大家都听你懂了吗?(博主写了一天了,累死了,求求给一个赞吧,谢谢了),听懂了的话记得三连交一下学费,那么这期就到此为止了,我们下期再见,拜拜┏(^0^)┛!!!

    PS:给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!给个赞吧!!!

  • 相关阅读:
    乾坤微服务的使用
    438页19万字农牧业综合服务信息化减灾应急建设方案
    Linux 系统移植(一)-- 系统组成
    小礼盒礼金卡接口分享
    java计算机毕业设计动漫论坛系统MyBatis+系统+LW文档+源码+调试部署
    【SpringBoot】SpringBoot2的一些特性
    143. 最大异或对(01字典树)
    sprinboot 引入 Elasticsearch 依赖包
    基于spring boot的毕业设计论文选题申报管理系统
    RabbitMQ中Direct交换机的用法
  • 原文地址:https://blog.csdn.net/zyxtjzys/article/details/128109040