系列文章目录
文章目录
大vvvvvv
来学STL(1)<vector>使用初阶(持续更新)
按需求抓重点。收藏起来
说明
本文注重讲解常用的方法,偏方容易把我搞的云里雾里。
原创文章,未经允许禁止转载
vector容器的定义
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。(来自菜鸟教程)
我的理解,就是一个数组,不定长数组。就是这个数组长度不固定,按需求使用,就这么简单。
vector容器的简单代码使用(原始代码)
这个代码可以简单看一下vector的使用思路。详情请按需跳转
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;//创建一个容器,也可以说是数组
v.push_back(0);// 如果当做数组理解 就是v[0]=0,就是加入0元素
v.push_back(1);//v[1] = 1;
v.push_back(3);
v.push_back(4);
//让我们输出看一看吧
for(int i = 0;i<4;i++){
cout<<v[i]<<endl; //加入元素虽然用push_back,但是取值遍历像数组一样使用
}
return 0;
}
运行结果
0
1
3
4
vector容器的构造与赋值遍历(申请一个vector容器)
构造方法最常用的就是原始代码 当然还有其他的。可以查看这篇文章
==>> 戳我直达
如果不明白 那么看下面代码(简化)
vector<int> v1(); //创造一个空v1,小括号爱要不要,看脸
vector<int> v2(10); //这个就是直接申请了一个初始长度为10的数组,但是与普通数组不同的是它还可以加元素
vector<int> v3(10,0); //申请空间为10,并把这10个空间初始化为0 还挺好用
vector<int> v4(v3); //复制所有的元素 就是对v4赋值了,只不过赋值的是一个数组,STL的独特操作哈哈,也可以v3=v4。
vector<int> v5(v3.begin(),v3.begin()+5); // 将v3的开始到第五个元素复制到v5中。
赋值:
push_back()函数—我不太喜欢搬定义,掌握使用方法就好。
看这个名字很容易知道,它会在数组后面添加一个数(专业一点就是先申请一个空间,然后添加数)。
那么又有人会问,如果在中间添加一个数咋办。
inset()函数—插入一个数。可以在指定位置插入一个数
使用方法,一言不合就放代码
这里只介绍常用且方便的几种方法,因为麻烦的我晕。
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;//创建一个容器,也可以说是数组
v.push_back(0);// 如果当做数组理解 就是v[0]=0,就是加入0元素
v.push_back(1);//v[1] = 1;
v.push_back(3);
v.push_back(4);
//让我们输出看一看吧
for(int i = 0;i<4;i++){
cout<<v[i]<<endl; //加入元素虽然用push_back,但是取值遍历可以像数组一样使用
}
//inset(要插入元素的地址,插入元素的值) ;
v.insert(v.begin(),2); //在最前面插入2,也就是说 v[0]=2了。
//v.begin()是数组的起始地址,v.end()是结尾地址。
for(int i = 0;i<5;i++){
// 5?? 插入了一个元素,长度不就变5了。
cout<<v[i]<<' ';
}
cout<<endl;
v.insert(v.begin()+2,5); //在第二个位置插入位置5,v[2]=5;
for(int i = 0;i<6;i++) cout<<v[i]<<' ';
cout<<endl;
return 0;
}
运行结果
0
1
3
4
2 0 1 3 4
2 0 5 1 3 4
注意,inset是在地址层面操作,第一个参数是地址,第二个是你要插入的数。也就是如果要大量的插入,简单的办法是用迭代器(以后更新),总之就是你告诉这个函数–我要在什么----“地址”----的地方插入什么----“元素”----
我不喜欢inset,因为它代表插队(嘿嘿~~~).
遍历函数
遍历函数也就是当最简单的数组遍历就行,就是数组的用法,看原始代码的for循环就懂了。
还有一种迭代器遍历,知道迭代器就可以了。不细讲,如果需要的就评论。
vector容器的获取长度、删除与sort排序
1.获取长度
size()函数都可以获取容器(数组)的大小。
很好理解,直接看代码
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;//创建一个容器,也可以说是数组
v.push_back(0);// 如果当做数组理解 就是v[0]=0,就是加入0元素
v.push_back(1);//v[1] = 1;
v.push_back(3);
v.push_back(4);
//让我们输出看一看吧
for(int i = 0;i<4;i++){
cout<<v[i]<<endl; //加入元素虽然用push_back,但是取值遍历可以像数组一样使用
}
//把上面的4改成length() 意味着 size()=4
for(int i = 0;i<size();i++){
cout<<v[i]<<endl;
}
return 0;
}
运行结果:
0
1
3
4
0
1
3
4
v.size() = 4
2.删除:
1.删除整个容器 :clear()函数。直接清空vector里面的数,注意,他不会把房间退了,就是不会释放空间,如果释放空间,可以用swap(),知道就好,用的不多,详细看代码
vector<int> v;
v.push_back(1);
v.push_back(2);
cout<<v.size()<<endl;
v.clear();
cout<<v.size()<<endl;
vector<int>().swap(v); //知道就好,用的不多,
//因为clear()之后size就在0,
//所以只用个clear就可以以为是清空了
cout<<v.size()<<endl;
运行结果
2
0
0
*2.删除某个元素:*有插队用的inset(),也会有踢出(删除)某个元素的函数
erase()函数,删除某个元素。
erase的函数原型有两种形式:
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
第一个是删除单个位置的元素,也就是说—“给我删掉这个元素”
第二个是删除连续位置的元素,也就是说—“给我删掉从first到last的元素”
不难理解,上代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;//创建一个容器,也可以说是数组
v.push_back(0);// 如果当做数组理解 就是v[0]=0,就是加入0元素
v.push_back(1);//v[1] = 1;
v.push_back(3);
v.push_back(4);
//让我们输出看一看吧
for(int i = 0;i<4;i++){
cout<<v[i]<<endl; //加入元素虽然用push_back,但是取值遍历可以像数组一样使用
}
v.erase(v.begin()); //v[0]的元素
for(int i = 0;i<v.size();i++) cout<<v[i]<<' ';
cout<<endl;
v.erase(v.begin(),v.begin()+2);//删除v[0]到v[2]的函数
for(int i = 0;i<v.size();i++) cout<<v[i]<<' ';
cout<<endl;
cout<<"v.size() = "<<v.size()<<endl;
v.erase(v.begin(),v.end()); //删除所有元素
cout<<"v.size() = "<<v.size()<<endl;
return 0;
}
运行结果
0
1
3
4
1 3 4
4
v.size() = 1
v.size() = 0
注意:与inset()一样,在地址的层面操作,如果删除特定元素删除,可以用迭代器遍历删除,或者,你有更好的办法?
3.sort排序
本质上与数组排序相同,都是传给sort()函数地址,但是写法不同,代码如下,附说明
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[3];
vector<int> v;
a[0] = 2;
v.push_back(2);
a[1] = 3;
v.push_back(3);
a[2] = 1;
v.push_back(1);
sort(a,a+3); //数组排序
sort(v.begin(),v.end()); //stl容器排序
//如果v写出sort(v,v+3)不能通过编译,因为其不能代表地址,数组的a与a+3是代表地址的
for(int i = 0;i<3;i++) cout<<a[i]<<' ';
cout<<endl;
for(int i = 0;i<v.size();i++) cout<<v[i]<<' ';
return 0;
}
运行结果:
1 2 3
1 2 3
持续更新中…