关于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语言零基础讲解指针和数组

    C语言零基础讲解指针和数组

    由于数据的表现形式多种多样,还有字符型和其它的数值类型,因此仅有基本数据类型是不够的。是否可以通过基本数据类型的组合抽象构造其它的数据类型呢?下面是小编为大家带来的C语言数组与指针详解的知识
    2022-04-04
  • C++实现小型图书管理系统

    C++实现小型图书管理系统

    这篇文章主要为大家详细介绍了C++实现小型图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Windows下VScode实现简单回声服务的方法

    Windows下VScode实现简单回声服务的方法

    回声服务端可以将客户端传来的信息,再原封不动地发送给客户端,因而得名 epoch 服务。接下来通过本文给大家介绍Windows下VScode实现简单回声服务的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • 详谈C++ socket网络编程实例(2)

    详谈C++ socket网络编程实例(2)

    这篇文章主要为大家介绍了C++ socket网络编程实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • C++印刷模板使用方法详解

    C++印刷模板使用方法详解

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型
    2022-11-11
  • C++中关于多态实现和使用方法

    C++中关于多态实现和使用方法

    这篇文章主要介绍了C++中关于多态实现和使用方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++详细分析讲解函数参数的扩展

    C++详细分析讲解函数参数的扩展

    在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值。也就是说,调用函数时可以省略有默认值的参数
    2022-04-04
  • C语言创建链表错误之通过指针参数申请动态内存实例分析

    C语言创建链表错误之通过指针参数申请动态内存实例分析

    这篇文章主要介绍了C语言创建链表错误之通过指针参数申请动态内存,是链表创建过程中非常常见的经典错误。实例中做了较为详尽的分析,需要的朋友可以参考下
    2014-09-09
  • C++关于类结构体大小和构造顺序,析构顺序的测试详解

    C++关于类结构体大小和构造顺序,析构顺序的测试详解

    这篇文章主要介绍了C++类结构体大小和构造顺序,析构顺序的测试,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Linux中利用c语言删除某个目录下的文件

    Linux中利用c语言删除某个目录下的文件

    这篇文章主要给大家介绍了Linux中利用c语言删除某个目录下文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论