关于vector的常见用法详解

 更新时间:2023年02月06日 10:56:58   作者:辉小歌  
这篇文章主要介绍了关于vector的常见用法详解,vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间,本文给大家介绍的非常详细,需要的朋友可以参考下

vector翻译为向量,但是这里使用“变长数组”的叫法更容易理解,也即“长度根据需要而自动改变的数组”。在考试题中,有时会碰到只用普通数组会超内存的情况,这种情况使用vector会让问题的解决便捷许多。另外, vector还可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)、又害怕使用指针实现邻接表的读者是非常友好的写法也非常简洁。

需要的头文件:

#include <vector>

需要的其他东西:

using namespace std;

vector的定义

vector的定义的格式:

vector<typename> name;

上面这个定义其实相当于是一维数组name[ SIZE ],只不过其长度可以根据需要进行变化,
比较节省空间,说通俗了就是"边长数组"。

和一维数组一样,这里的typename 可以是任何基本类型,例如: int 、double 、char、结构体等,也可以是STL标准容器,
例如 vector 、set、queue等。需要注意的是,如果typename也是一个STL容器,定义的时候要记得在 >> 符号之间加上空格,
因为一些使用C++ 11之前标准的编译器会把它视为移位操作,导致编译错误。
例子:

#include<cstdio>
#include<vector>
using namespace std;
struct student
{
	int age;
	char name[20];	
};
int main(void)
{
	vector<int> a;
	vector<double> b;
	vector<char> c;
	vector<student> d;
	return 0;
} 

如果typename 是vector,就是下面这样定义:

vector< vector<int> > name;//  >>之间要加空格

可以很容易联想到二维数组的定义,即其中一维是一个数组的数组。那么二维vector数组也是一样的,
即Arrayname[]中的每一个元素都是vector。
初学者可以把二维vector 数组当作两个维都可变长的二维数组理解。

定义vector数组的方法:

vector<typename> Arrayname[arraySize];

这样Arrayname[0] ~ Arrayname[ arraySize - 1 ] 中的每一个元素都是一个vector容器。

与vector<vector<int> > name 不同的是,这种写法的一维长度已经固定为arraySize,另一维才是"变长"的

vector容器内元素的访问

vector一般有两种访问方式 , 通过下标访问或通过迭代器访问。

一、通过下标访问

和访问普通的数组是一样的,对一个定义为vector vi 的容器来说
直接访问vi[ index ] 即可(如vi[0]、vi[1])。当然这里的下标是从0 到 vi.size()-1。
访问这个范围外的元素可能会出错。

二、通过迭代器访问

迭代器( iterator ) 可以理解为一种类似指针的东西,其定义是:

vector<typename>::iterator it;  //可以迭代器就是定义一个 vector类型的指针

vector<typename>::iterator it;  //可以迭代器就是定义一个 vector类型的指针

这样it 就是一个vector:: iterator型的变量,其中 typename 就是定义vector时填写的类型。
下面是typename为int和 double 类型的举例:

vector<int> ::iterator it;
vector<double> ::iterator it;

这样就得到了迭代器it,并且可以通过 *it 来访问vector里的元素

从这里可以看出 vi [ i ] 和 * ( vi.begin() + i )是等价的。
上面中的begin()函数的作用为 : 取 a的首元素地址。
end()函数是取a的尾元素地址的下一个地址。end()作为迭代器末尾标志,不存储任何元素。

除此之外,迭代器还实现了两种自加操作: ++it 和 it++
于是有了另一种遍历vector中元素的写法:

需要注意的是: vector的迭代器不支持 it < v1.end() 写法,因此循环条件只能用 it != vi.end()

最后需要指出,在常用STL容器中,只有在vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法。

vector常用函数

(1) push_back()
顾名思义,push_back(x)就是在vector后面添加一个元素x,时间复杂度为O(1)。

(2) pop_back()
pop_back()用以删除vector的尾元素,时间复杂度为O(1)。
注意: pop_back()函数是没有参数的

(3) size()
size()用来获得vector中元素的个数,时间复杂度为O(1)。size()返回的是unsigned类型,
不过一般来说用%d不会出很大问题,这一点对所有STL容器都是一样的。
例子:

(4) clear()
clear()用来清空vector中的所有元素,时间复杂度为O(N),其中N为vector中元素的个数。

(5) insert()
inesrt(it,x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度O(N)。

(6)erase()
erase()有两种方法: 删除单个元素、删除一个区间内的所有元素。时间复杂度都为O(N)。
①删除单个元素
erase(it) 即删除迭代器为it处的元素。

②删除一个区间内的所有元素
erase(first,last)即删除 [ first , last) 内的所有元素。

上面的说法可以直到,如果要删除这个vector内的所有元素,
正确的写法应该是v1.erase( v1.begin() , v1.end() )。
这正如前面说过,v1.end()就是尾元素地址的下一个地址。
当然,更方便的清空vector的方法是使用v1.clear()。

vector的常见用途

(1)存储数据

  • vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间。
  • 有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。
  • 由于输出数据的个数不确定的,为了更方便地处理最后一个满足条件地数据后面不输出额外地空格,可以先用vector记录所有需要输出的数据,然后一次输出。

(2)用邻接表存储图
使用vector实现邻接表可以让一些对指针不太熟悉的读者有一个比较方便的写法。

到此这篇关于vector的常见用法详解的文章就介绍到这了,更多相关vector的常见用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++11学习之包装器解析

    C++11学习之包装器解析

    function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。本文就来和大家聊聊我们为什么需要function呢
    2023-02-02
  • C++中用substr()函数消除前后空格的解决方法详解

    C++中用substr()函数消除前后空格的解决方法详解

    本篇文章是对C++中用substr()函数消除前后空格的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c++模拟实现string类详情

    c++模拟实现string类详情

    这篇文章主要介绍了c++模拟实现string类详情,string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中,下面进入文章一起看看详细内容吧
    2022-01-01
  • C++线程同步实例分析

    C++线程同步实例分析

    这篇文章主要介绍了C++线程同步实例分析,以实例的形式较为深入的分析了C++的线程同步问题,是一个较为经典的线程同步问题,需要的朋友可以参考下
    2014-10-10
  • Qt在vs2019中使用及设置方法

    Qt在vs2019中使用及设置方法

    这篇文章主要介绍了Qt在vs2019中使用及设置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Qt利用QChart实现实时波形图的绘制

    Qt利用QChart实现实时波形图的绘制

    这篇文章主要介绍了Qt如何利用QChart实现实时波形图的绘制,文中的示例代码讲解详细,对我们学习有一定是参考价值,需要的可以参考一下
    2022-06-06
  • OpenCV 直方图均衡化的实现原理解析

    OpenCV 直方图均衡化的实现原理解析

    直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法,今天通过本文给大家介绍OpenCV 直方图均衡化的实现原理解析,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • 一文详解C++中的转换构造函数

    一文详解C++中的转换构造函数

    在 C/C++ 中,不同的数据类型之间可以相互转换,无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换,本文就给大家详细介绍一下C++的转换构造函数,需要的朋友可以参考下
    2023-09-09
  • C++浅析类与对象基础点

    C++浅析类与对象基础点

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-07-07
  • 浅谈QT内存泄漏

    浅谈QT内存泄漏

    本文主要介绍了浅谈QT内存泄漏,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论