目录
前言?没有前言,直接进入正题吧。
今天要和大家讲的是STL中最常用,最强大的STL容器——vector。
简介
vector,直译过来就是向量,意为动态数组。它是STL中最强大,最实用且常用的容器。其实际用途很高,在有些场景或范围下,可以直接代替数组,所以被我们挚爱。
vector的实际用法很多,可以动态分配内存,比数组灵活,大小不限,可插可删,对于我们这种C++党的人来说就是一个天大的福利!而且十分好用。
基本功能介绍
头文件
#include <vector>
或
#include <bits/stl_vector.h>
诶,等一下,这是不是闲的啊?[滑稽]
#include <bits/stdc++.h>
直接这个不就行了吗?
注意:vector容器是在std里的,所以一定要有using namespace std;这行语句。
基本用法
//注意:创建时不指定大小时长度默认为0,也就是空的
vector<int> v; //创建一个int类型的vector
vector<double> v; //创建一个double类型的vector
vector<string> v; //创建一个string类型的vector
//创建一个二维int类型的vector
vector<vector<int> > v; //或
vector<vector<int>> v;
//注意,在C++98之前,要用上面第一种写法,因为下面的写法可能会被误识别成右移运算符。
vector<int> v(100); //定义100个元素大小的int类型vector
vector<int> v(100,1); /定义100个元素大小的int类型的vector,并赋初值为1
常用功能
begin(); //头指针
rbegin(); //反向的,同上
end(); //尾指针
rend(); //反向的,同上
push_back(x); //在末尾插入元素
pop_back(); //在末尾弹出元素
operator[] //访问下标位置的元素
erase(pos); //在pos位置删除元素
erase(pos,num); //在pos位置删除num个元素
insert(pos,num); //在pos位置插入num
size(); //该vector的长度
empty(); //判断是否为空
clear(); //清空
resize(len); //重置长度
begin():返回vector的头部迭代器。
end():返回vector的尾部迭代器。
rbegin()和rend():同上
push_back():这个……用代码解释吧……
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
v.push_back(123);
for(int i : v) cout << i; //这个后面会讲
return 0;
}
输出结果:
123
pop_back():同上,用代码解释。
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
v.push_back(21);
v.push_back(123);
for(int i : v) cout << i << " ";
cout << endl;
v.pop_back();
for(int i : v) cout << i << " ";
return 0;
}
输出结果:
21 123
21
operator[]:这应该是所有STL容器中最强大的功能之一了(迭代器除外),因为vector中已经帮你把[]重载了,所以非常方便。
例:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
v = {1,2,3,4,5,5,4,3,2,1};
for(int i=0; i<v.size(); i++) printf("数组下标为%d的值为:%d\n",i,v[i]);
return 0;
}
数组下标为0的值为:1
数组下标为1的值为:2
数组下标为2的值为:3
数组下标为3的值为:4
数组下标为4的值为:5
数组下标为5的值为:5
数组下标为6的值为:4
数组下标为7的值为:3
数组下标为8的值为:2
数组下标为9的值为:1
erase():它的功能是删除字符串,有两种用法。只填一个参数pos时,删除pos之后的所有元素;填两个参数pos,n时,删除pos之后n个元素。
例:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
v = {4,12,6,2,6,1};
v.erase(4);
cout << "删除下标为4的元素后:";
for(int i:v) cout << i << " ";
return 0;
}
运行结果:
删除下标为4的元素后:4 12 6 2 1
insert():在pos下标处插入num。
代码类似,so,同上。
size():获取vector长度。
例子的话……我也不知道该怎么写了……
empty():判断是否为空。
其他不解释。
clear():清空数组。
不解释。
resize():重置vector的长度。
还是不解释。
实用方法
遍历
下标访问:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int< v;
v = {1,2,3,4,5,6,7};
for(int i=0; i<v.size(); i++){
cout << v[i] << " ";
}
return 0;
}
迭代器访问(不建议使用):
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
v = {1,2,3,4,5,6,7);
for(vector<int>::iterator it=v.begin(); it!=v.end(); it++){
cout << *it << " ";
//注意这里一定要加个*,否则会报错的。
}
return 0;
}
为什么不建议,因为太费手了!(难写)
迭代器(优化):
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
v = {1,2,3,4,5,6,7};
for(auto it=v.begin(); it!=v.end(); it++){
cout << *it << " ";
}
return 0;
}
优化就优化在了简写。
for_each遍历:
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
v = {1,2,3,4,5,6,7};
for(auto i : v){
cout << i << " ";
}
return 0;
}
上面三个的运行结果:
1 2 3 4 5 6 7
结语
这期STL讲解就到这里,我们下期再见,拜了个拜!