Vector(向量)是一个不定长数组,在竞赛中灵活应用可以使一些问题简便许多(例如实现滚动数组, 实现数组插入与删除等等)
1> 定义
#include <vector>
vector<类型名> 变量名;
例:vector<int> a;
2> 常用操作
- a[i] 访问第i个元素
- a.empty() 判断是否为空
- a.size() 返回元素个数
- a.resize() 修改动态数组大小
- a.push_back(x) 在动态数组尾部加一个元素
- a.pop_back() 删除尾部一个元素
- a.begin() 指向头部的迭代器(指针)
- a.end() 指向尾部+1位置的迭代器(指针)
3> 其他操作
- c.~vector() 销毁所有元素
- c.insert(pos, a) 在pos处插入元素a
- c.erase(a, b) 删除区间[a, b)内的元素
- c.swap(c1) 交换c,c1
- c.front() 返回第一个元素
- c.back() 返回最后一个元素
- c.capacity() 返回当前动态容量
- c.max_size() 返回最大可以装的元素个数
应用1:利用Vector排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> a;
int n, tmp;
int main() {
cin >> n;
for(int i=0; i<n; i++) {
cin >> tmp;
a.push_back(tmp);
}
sort(a.begin(), a.end());
for(int i=0; i<n; i++) cout << a[i] << " ";
cout << endl;
return 0;
}
应用2:M-N=P Problem
n个从小到大排好序的整数,一个数p,要求在这n个整数中找两个数M和N,使M-N=P,问方案总数.
(注:1 <= n <= 1,000,000,000)
Input:
4 2
1 1 2 2
Output:
4
由于n的范围很大,所以需要动态数组(滚动数组),这里用Vector就方便许多。
解题思路:每次读入tmp,从头遍历,将小于tmp - p的删去(因为这n个数有序,越来越大,之后组成的方案一定与此数无关),等于时记录,大于时结束遍历;
#include <iostream>
#include <vector>
using namespace std;
int n, p, count;
vector<int> a;
int main() {
int tmp;
vector<int>::iterator X; //迭代器(指向元素)
cin >> n >> p;
for(int i=1; i<=n; i++) {
cin >> tmp;
a.push_back(tmp);
for(X = a.begin(); X < a.end();) {
if(*X < tmp - p)
a.erase(X); //删除后X实际已指向了下一个元素 无需X++
else if(*X == tmp - p) {
count ++;
X ++;
} else break;
}
}
cout << count << endl;
return 0;
}
应用3:括号配对(字符串)
输入一段由中括号、小括号组成的字符串,判断是否配对,配对输出YES, 不配对输出NO
Input 1:
[]()
Input 2:
[(])
Input 3:
[()[()]]
Output 1:
YES
Output 2:
NO
Output 3:
YES
解题思路:每次删去相连的括号直到删完(YES)或无法再删(NO)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<char> a;
string s;
bool FLag;
int main() {
vector<char>::iterator X;
cin >> s;
for(int i=0; i<s.size(); i++) a.push_back(s[i]);
while(true) {
bool Find = false;
for(X = a.begin(); X < a.end() - 1; X++) {
if(*X == '(' && *(X+1) == ')'|| *X == '[' && *(X+1) == ']') {
Find = true;
a.erase(X, X+2);
break;
}
}
if(a.empty()) break;
if(!Find) {
FLag = true;
break;
}
}
if(FLag) cout << "NO" << endl;
else cout << "YES" << endl;
return 0;
}
就到这~