关于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的常见用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)

    深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)

    本篇文章是对const int *p与int * const p的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 关于C语言操作符的那些事(超级全)

    关于C语言操作符的那些事(超级全)

    这篇文章主要给大家介绍了关于C语言操作符的那些事儿,c语言的操作符有很多,包括算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员,需要的朋友可以参考下
    2021-08-08
  • C语言实现影院管理系统

    C语言实现影院管理系统

    这篇文章主要为大家详细介绍了C语言实现影院管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 链接库动态链接库详细介绍

    链接库动态链接库详细介绍

    静态链接库.lib和动态链接库.dll。其中动态链接库在被使用的时候,通常还提供一个.lib,称为引入库,它主要提供被Dll导出的函数和符号名称,使得链接的时候能够找到dll中对应的函数映射
    2012-11-11
  • C++ for循环与nullptr的小知识点分享

    C++ for循环与nullptr的小知识点分享

    这篇文章主要是来和大家介绍一些C++中的小知识点,本文分享的是for循环与nullptr,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-05-05
  • 利用c语言实现卷积码编码器示例

    利用c语言实现卷积码编码器示例

    这篇文章主要介绍了利用c语言实现卷积码编码器示例,需要的朋友可以参考下
    2014-03-03
  • C++ vector的介绍及常见功能实现

    C++ vector的介绍及常见功能实现

    这篇文章主要介绍了C++ vector的介绍及模拟实现,vector在实际中非常的重要,但在实际中我们只要熟悉常见的接口就可以了,最重要的是理解他的底层原理,要能够自己模拟实现出一个简单的vector,本文结合示例代码给大家详细介绍,需要的朋友可以参考下
    2023-05-05
  • c++ 对象分配在栈上还是在堆上问题分析

    c++ 对象分配在栈上还是在堆上问题分析

    这篇文章主要为大家介绍了c++ 对象在栈上还是在堆上问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • C++ OpenCV实战之制作九宫格图像

    C++ OpenCV实战之制作九宫格图像

    本文将为大家介绍如何使用OpenCV C++ 制作九宫格图像,即将一张图像均等分成九份,然后将这九个小块按一定间隔拷贝到新画布上就可以啦。感兴趣的可以动手试一试
    2022-01-01
  • 一文学会数据结构-堆

    一文学会数据结构-堆

    本文主要介绍了数据结构-堆,文中通过图片和大量的代码讲解的非常详细,需要学习的朋友可以参考下这篇文章,希望可以帮助到你
    2021-08-08

最新评论