写在前面的话
在力扣上刷了一段时间的题,经常用到vector,于是便整理出了这篇文章。
vector是向量类型,可以容纳C++几乎所有类型的数据,因此也被称为容器
当然,也可以理解为动态数组,是STL帮我们封装好了的类
进行vector操作前应添加头文件#include<vector>(当然,如果你用万能库,当我没说)
目录
1. vector初始化
这一板块将展现如何声明与初始化一个vector容器。
方式Ⅰ:
一个最常规的初始化,不规定任何的大小与初始值。
vector<x> y; //定义一个x类型的容器y
方式Ⅱ:
运用这种方式,你可以规定一个容器的大小,嗯,就像数组一样。
vector<x> y(z); //z是一个数字,该语句表示定义一个大小为z的x类型容器y
方式Ⅲ:
好消息是,方式Ⅲ不仅可以规定容器的大小,还可以给容器的每个元素以一个初始值。
vector<x> y(z, h); //h是一个x类型的变量,会赋值给类型为x,大小为z的容器中的每个元素
方式Ⅳ:
vector最高端的地方在于,你可以用以下这种语法,将一个已经操作过的动态数组直赋值给这个新定义的vector!
vector<x> y(z); //用容器z向y赋值(类型同为x),使两者完全等价
方式Ⅴ:
nb的 vector甚至可以从另一个容器中抽出特定的几个元素赋初始值!
vector<x> y(z.begin(),z.begin+3);//将z中第0-2个元素赋值给y,y的类型为x型
2. vector自带函数
用一段代码讲解吧……
#include <vector>
vector<int> a, b;
a.front(); //返回a的第一个元素
a.back(); //返回a的最后一个元素
a.clear(); //清空a中的元素
a.empty(); //判断a是否为空,空则返回true,非空则返回false
a.pop_back(); //删除a向量的最后一个元素
a.push_back(3); //在a的最后一个向量后插入一个元素,其值为3
a.erase(a.begin()+1,a.begin()+3); //删除第二个到第四个元素(左开右闭)
//上面的erase是清除多个元素,接下来的是只清除一个元素的写法
a.erase(a.begin() + 1); //清除第二个元素
a.size(); //返回a中元素的个数
a.swap(b); //b为向量,将a中的元素和b中的元素整体交换
注:vector没有 pop_front()
和 push_front()
函数
还有一些其他酷毙了的函数,这里因为篇幅关系,不一一展现。
3.vector其他操作与易错点
调用*(容易出错)
虽然vector容器与数组有诸多不同,但是就调用而言,可以说是十分类似。
a[i]; //当且仅当a[i]存在
是的你没看错,和数组几乎一模一样,这句话的意思是调用了容器a的第i个元素。
那么接下来看这段代码,请判断它的正确与否。
#include <bits/stdc++.h>
#include <vector>
using namespace std;
vector<int> a;
int main() {
for(int i = 0; i < 10; i ++) a[i] = i;
}
想必细心的同志已经发现了,不对!为什么?注意上文的一句注释:
当且仅当a[i]存在
a[0~9]在上文并不存在,我们也没有向a内压入或者赋值什么元素,这就是整个问题的关键。
比较
vector也有大小的比较,需要注意的是,只有每个元素都是相等的,两个容器才算是相等。
vector<int> a, b;
a == b;
a >= b;
a <= b;
a > b;
a < b;
a != b;
其实,vector这个玄学玩意儿在很多地方和其他东西都是类似的。
都看到这里了,这位仁兄,点个免费的赞再走呗
I am very vegetable.
参考文献:C++_vector操作