vector属于动态数组,类比于Java里面的ArrayList,本文旨在为读者讲解最常用的vector的函数,与一些使用技巧,作者为算法工程师,所以比较偏向于算法题的写法。
// 定义具有10个int类型元素的向量,不具备初始值
vector<int> v(10);// 定义具有10个int类型的元素,初始全为1
vector<int>v(10, 1);// 拷贝构造,将v0的内容拷贝构造到v中
vector<int>v(v0);// 将向量v0中的0-5的元素赋值给v,两个向量需要类型相同
// 这里涉及到vector的一个方法begin(),对应的还有end(),begin()代表vector的第一个元素
// end()代表最后一个元素的后一位的指针
vector<int>v(v0.begin(), v.begin() + 5); // 一共5个元素// 从数组中获取初始值
int v0[3] = {0, 1, 2};
vector<int> v(v0, v0 + 3);按照数组下标式遍历
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(10, 1);
for (int i = 0; i < v.size(); ++ i) // size()函数为获取容器的大小,每个容器都有的
{
cout << v[i] << " ";
}
// 运行结果:
// 1 1 1 1 1 1 1 1 1 1
return 0;
}auto遍历(新语法devc++可能需要调成c++11才能用)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(10, 1);
for (auto x : v) // x为当前的值,v为容器
{
cout << x << " ";
}
// 运行结果:
// 1 1 1 1 1 1 1 1 1 1
return 0;
}迭代器遍历
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(10, 1);
// 不推荐 比较长 不适合搞算法题
for (vector<int>::iterator it = v.begin(); it != v.end(); ++ it)
{
// it为指针
cout << *it << " ";
}
// 运行结果:
// 1 1 1 1 1 1 1 1 1 1
return 0;
}void push_back(T x):给向量最后的位置加一个元素
void pop_back():弹出向量最后一个元素
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(10, 1);
// push_back()前
for(auto it : v)
{
cout << it << " ";
}
cout << endl;
// 运行结果
// 1 1 1 1 1 1 1 1 1 1
// push_back()后
v.push_back(10);
for(auto it : v)
{
cout << it << " ";
}
cout << endl;
// 运行结果
// 1 1 1 1 1 1 1 1 1 1 10
// pop_back()后
v.pop_back();
v.pop_back();
for(auto it : v)
{
cout << it << " ";
}
// 运行结果
// 1 1 1 1 1 1 1 1 1
return 0;
}T front():获取容器中第一个元素
T back(): 获取容器中最后一个元素
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int v0[5] = {1, 2, 3, 4, 5};
vector<int> v(v0, v0 + 5);
cout << "第一个元素为:" << v.front() << endl;
cout << "最后一个元素为:" << v.back() << endl;
// 运行结果
/*
第一个元素为:1
最后一个元素为:5
*/
// vector支持下标访问 也可以这样
cout << "第一个元素为:" << v[0] << endl;
cout << "最后一个元素为:" << v[v.size() - 1] << endl;
// 运行结果
/*
第一个元素为:1
最后一个元素为:5
*/
return 0;
}#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int v0[9] = {1, 5, 1, 0, -1, -666, 8, 994, 456};
vector<int> v(v0, v0 + 9);
cout << "排序前:";
for (auto x : v) cout << x << " ";
cout << endl;
// 运行结果:
// 排序前:1 5 1 0 -1 -666 8 994 456
cout << "排序后:";
sort(v.begin(), v.end()); // 可以控制范围,可以对v部分排序,我这里是对整个vector排序 默认升序排序
for (auto x : v) cout << x << " ";
cout << endl;
// 运行结果:
// 排序后:-666 -1 0 1 1 5 8 456 994
return 0;
}这基本上是sort()的内容
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool compare(int a, int b) {
return a > b;//降序排列
}
int main()
{
int v0[9] = {1, 5, 1, 0, -1, -666, 8, 994, 456};
vector<int> v(v0, v0 + 9);
cout << "排序前:";
for (auto x : v) cout << x << " ";
cout << endl;
// 运行结果:
// 排序前:1 5 1 0 -1 -666 8 994 456
cout << "排序后:";
// 可以控制范围,可以对v部分排序,我这里是对整个vector排序
sort(v.begin(), v.end(), compare);
for (auto x : v) cout << x << " ";
cout << endl;
// 运行结果:
// 排序后:994 456 8 5 1 1 0 -1 -666
return 0;
}翻转函数
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool compare(int a, int b) {
return a > b;//降序排列
}
int main()
{
int v0[9] = {1, 5, 1, 0, -1, -666, 8, 994, 456};
vector<int> v(v0, v0 + 9);
cout << "翻转前:";
for (auto x : v) cout << x << " ";
cout << endl;
// 运行结果:
// 翻转前:1 5 1 0 -1 -666 8 994 456
reverse(v.begin(),v.end());
cout << "翻转前:";
for (auto x : v) cout << x << " ";
cout << endl;
// 运行结果:
// 翻转前:456 994 8 -666 -1 0 1 5 1
return 0;
}在vector的一段区间里面寻找一个元素,不包括右边界,如果找到了返回第一次出现的指针,没有找到返回```null``
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool compare(int a, int b) {
return a > b;//降序排列
}
int main()
{
int v0[9] = {1, 5, 1, 0, -1, -666, 8, 994, 456};
vector<int> v(v0, v0 + 9);
vector<int>::iterator it = find(v.begin(), v.end(), 100);
cout << *it << endl;
// 运行结果
// 0 // 0代表空指针
it = find(v.begin(), v.end(), 1);
cout << *it << endl;
// 运行结果
// 1 // 1代表第一个位置的指针
return 0;
}