C++ STL-Vector动态数组

本文详细介绍C++中的Vector容器,包括其定义、基本操作及高级应用。通过实例展示如何使用Vector进行排序、解决数学问题及字符串匹配等,适用于初学者及进阶读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}


就到这~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值