在C++的学习中大家肯定都遇到过vector,之前学习的时候并没有在意,但是在牛客网刷题的时候发现大部分题中都用到了vector,但是自己并不会很好的使用所以今天就主要的来给大家分享一下vector是什么是怎么使用的。
一、向量的介绍
向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
模板类vector类似于string类,是一种动态数组,可以在运行的阶段设置vector对象的长度,可在末尾添加新的数据,还可以在中间添加新的数据,基本上,它是使用new创建动态数组的替代品。实际上,vector类确实使用new和delete来管理内存。
vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作。
二、向量的声明及初始化
vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:
vector<int> a ; //声明一个int型向量a
vector<int> a(10) ; //声明一个初始大小为10的向量
vector<int> a(10, 1) ; //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; //声明并用向量a初始化向量b
vector<int> b((), ()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
除此之外, 还可以直接使用数组来初始化向量:
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
对于vector的初始化还是和我们之前所定义的数据还是有一些不一样的,这里我认为可以理解成两种当前定义的数据是两种类型,一种是系统的数据类型int类型 int数组等等另一个类型是我们自定义的类型,例如我们现在是一个人类,并且我也是一个****的用户,只有定义了我是一个****用户之后我才可以在这里发表自己的博客。并且这里我认为最应该注意的是最后三行,对于vector的数据的初始化,这里不同于我们之前,对于数组的拷贝并不是通过以往复杂的for循环来实现,这里是直接可以将数组赋值给我们的vector数组的。
在我们对vector进行访问的时候,是和我们之前的普通数组是一样的。
#include<iostream>
#include<vector>
using namespace std ;
int main()
{
vector<int> a(10, 0) ; //大小为10初值为0的向量a
//对其中部分元素进行输入
cin >>a[2] ;
cin >>a[5] ;
cin >>a[6] ;
//全部输出
int i ;
for(i=0; i<(); i++)
cout<<a[i]<<" " ;
return 0 ;
}
上程序我们先将vector数组初始化为0的数组大小长度为10的一个数组 ,之后我们和正常数组一样通过cin来进行赋值通过cout来进行输出。
但是不同于普通数组的是,vector还有一种他自己的访问方式。
在元素的输出上, 还可以使用遍历器(又称迭代器)进行输出控制。在 vector<int> b((), ()+3) ; 这种声明形式中, (()、()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。((), ())则表示起始元素和最后一个元素之外的元素位置。
向量元素的位置便成为遍历器, 同时, 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为: vector<int>::iterator。 遍历器不但表示元素位置, 还可以再容器中前后移动。
在上例中讲元素全部输出部分的代码就可以改写为:
//全部输出
vector<int>::iterator t ;
for(t=(); t!=(); t++)
cout<<*t<<" " ;
这里的 *t 为指针的间接访问形式, 意思是访问t所指向的元素值。
除去这些之外vector还有一些基本的操作,比如:
1>. () //获取向量中的元素个数
2>. () //判断向量是否为空
3>. () //清空向量中的元素
4>. 复制
a = b ; //将b向量复制到a向量中
5>. 比较
保持 ==、!=、>、>=、<、<= 的惯有含义 ;
如: a == b ; //a向量与b向量比较, 相等则返回1
6>. 插入 - insert
①、 ((), 1000); //将1000插入到向量a的起始位置前
②、 ((), 3, 1000) ; //将1000分别插入到向量元素位置的0-2处(共3个元素)
③、 vector<int> a(5, 1) ;
vector<int> b(10) ;
((), (), ()) ; //将(), ()之间的全部元素插入到()前
7>. 删除 - erase
①、 (()) ; //将起始位置的元素删除
②、 ((), ()+3) ; //将((), ()+3)之间的元素删除
8>. 交换 - swap
(a) ; //a向量与b向量进行交换
这些基本的函数操作都是已经写到库中的,所以如果用vector的话我们是不需要再定义那些函数是可以直接调用库中的。这就是vector相对于普通数组的一些优势。
对于vector的中多维数组这里我只简单的介绍一下对于vector的二维数组的定义
vector< vector<int> > b(10, vector<int>(5)); //创建一个10*5的int型二维向量
访问赋值都和我们上边的一样, 如果以后对于二维数组还有更加复杂的操作方式我会在给大家写博客进行介绍。
下边对vector进行一个简单的总结:
-
在C++中的详细说明
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,
简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
2. 使用vector,
必须在你的头文件中包含下面的代码:
#include
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector;
vector vInts;
或者连在一起,使用全名:
std::vector vInts;
建议使用全局的命名域方式:
using namespace std;
3. 初始化
vector // 创建一个空的vector。
vector c1(c2) // 复制一个vector
vector c(n) // 创建一个vector,含有n个数据,数据均已缺省构造产生
vector c(n, elem) // 创建一个含有n个elem拷贝的vector
vector c(beg,end) // 创建一个含有n个elem拷贝的vector
4. 析构函数
c.~vector () // 销毁所有数据,释放内存
- 成员函数
在C++的模板库中为vector提供了大量的自带成员函数上边我已经简单的介绍了几个,这里给大家分享一个网址Cplusplus上可以查到所有C++的一些定义等等内容,十分的方便并且是在不断的更新的,
/reference/vector/vector/?kw=vector
大家可以在这个网址上找到vector的一切介绍以及成员函数的介绍和使用,推荐大家用谷歌浏览器来访问这些英文界面,英语不好的直接使用翻译功能就可以了。
Vector的用法并不是只有简单的扩充数组这么简单,还有很多其他的更复杂的操作和更加多的使用方法,这里只是对于vector一个简单的介绍,和基本使用。