目录
我也从没想过STL中的vector还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!
前言
这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!那么事不宜迟,我们马上开始吧!
一、vector的定义和特性
1.基本介绍
在C++中,vector是一个动态数组容器,可以存储一系列相同类型的元素,其是标准库<vector.h>头文件中定义的模板类。
2.vector对象的声明
声明方式如下:
vector<int> vec;
3.vector对象的特性介绍
(1)容器大小:vector的本质是一个动态数组,可以根据需要自动调整大小。
(2)元素访问:可以通过索引(下标)访问。索引从0开始,到size(vec)-1结束。也可以使用[]运算符或at()函数来访问元素。但是一定要注意越界的问题!!一般我们在遍历时不会写i<=size(vec)-1,而是会写i<size(vec)。这是因为若vector为空,for循环内的判断条件越界(且能运行)导致出错。例如下面一串代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
vector<int> vec;
for (int i = 0; i <= size(vec) - 1; ++i) cout << i << endl;
return 0;
}
这串代码会不断输出i。而修改为i<size(vec)之后for循环语句块不会执行。
(3)元素的添加、删除和插入:push_back()函数、pop_back()函数、insert()函数,后面再介绍。
(4)容器大小管理:size()函数获取vector的大小;empty()函数检查vector是否为空;recize()函数调整vector的大小。
(5)迭代器:这里先简要介绍一下迭代器。迭代器的作用是用来访问容器(用来保存元素的数据结构)中的元素,所以使用迭代器,我们就可以访问容器中里面的元素。数组范围内的指针就是迭代器的一种。对于所有的迭代器,它们的使用方法和指针一样,比如自增(++),解引用(*)。vector类型提供了迭代器,用于遍历容器中的元素。可以使用vec.begin()函数获取指向第一个元素的迭代器,使用vec.end()可以获取指向最后一个元素之后位置的迭代器。
二、vector的常用函数
1.push_back()函数
其作用为将元素添加到vector的末尾。
2.pop_back()函数
其作用为删除vector末尾的元素。 注意:一定要保证vector非空!!
3.insert()函数
起作用为将元素插入到指定的下标。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
vector<int> vec = {0,1,2,4,5,6,7};
vec.insert(vec.begin()+3, 3);
for (auto i : vec)cout << vec[i] << " ";
return 0;
}
结果为:
0 1 2 3 4 5 6 7
三、vector排序去重
1.排序
要对vector进行排序,可以使用C++标准库中的sort()函数。该函数位于头文件<algorithm.h>中。sort()函数接受两个迭代器参数,表示要排序的范围。顺带提一嘴,如果要排序的是数组,就传入元素对应的指针即可。示例代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
vector<int> vec = {0,1,2,4,5,6,7};
int arr[7] = {0,1,2,4,5,6,7};
sort(vec.begin(), vec.end());
sort(arr, arr + 7);
cout << "vector: " << endl;
for (auto i : vec)cout << vec[i] << " ";
cout << "\narray:" << endl;
for (int i = 0;i<size(arr);++i)cout << arr[i] << " ";
return 0;
}
输出结果如下:
vector:
0 1 2 4 5 6 7
array:
0 1 2 4 5 6 7
2.去重
示例代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
vector<int> vec = { 2,1,3,2,4,1,5,4 };
sort(vec.begin(),vec.end());
auto last = unique(vec.begin(), vec.end());
vec.erase(last, vec.end());
for (const auto& i : vec)cout << i << " ";
return 0;
}
结果为:
1 2 3 4 5
四、综合示例代码
示例代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
vector<int> vec = { 0,2,1,4,5,6,7 };
cout << "before insert():";
for (auto i : vec)cout << i << " ";
cout << endl;
vec.insert(vec.begin() + 3, 3);
cout << "after insert():";
for (auto i : vec)cout << i << " ";
cout << endl;
sort(vec.begin(),vec.end());
cout << "after sort():";
for (auto i : vec)cout << i << " ";
cout << endl;
vec.erase(vec.begin() + 4, vec.end());
cout << "after erase():";
for (auto i : vec)cout << i << " ";
cout << endl;
if (vec.empty())cout << "empty" << endl;
else cout << "no empty" << endl;
cout << "size: " << size(vec) << endl;
vec.clear();
if (vec.empty())cout << "empty" << endl;
else cout << "no empty" << endl;
return 0;
}
结果为:
before insert():0 2 1 4 5 6 7
after insert():0 2 1 3 4 5 6 7
after sort():0 1 2 3 4 5 6 7
after erase():0 1 2 3
no empty
size: 4
empty