《算法笔记》6.1 vector

一. vector 的定义
1.头文件:#include< vector >
2.命名空间:using namespace std;
3.定义:vector<typename> name;
若 typename 也是一个STL容器,要在> >间加空格,例如:vector<vector<int> > name;
4.定义 vector 数组:vector<int> vi[100]
vi[0]~vi[99] 中的每一个都是一个 vector 容器(一维长度固定,二维长度随意);

二. vector 容器内元素的访问
1.下标访问:vi[index] 或 vi[index1][index2]
2.迭代器访问:vector<typename>::iterator it;
迭代器 it 是一个 vector<typename>::iterator 型的变量,类似于指针,可以通过 *it 访问容器内元素;
示例一:

vector<int>::iterator it = vi.begin();
//vi.begin()取 vi的首元素地址
for(int i = 0; i < n; i++) printf("%d",*(it + i));
//vi[i] 和 *(vi.begin() + i) 等价

示例二:

for(vector<int>::iterator it = vi.begin(); it != vi.end(); it++)
//vi.end() 取vi尾元素地址的下一个地址
//vector的迭代器不支持 it < vi.end() 的写法
	printf("%d",*it);

注:只有在 vector 和 string 中,才允许使用 vi.begin() + 3 (迭代器+整数)这种写法;

三.常用函数
1.push_back():在 vector 末尾添加一个元素;
2.pop_back():删除 vector 的末尾元素;
3.size():返回值是 unsigned 类型;
4.clear():清空 vector 中所有元素;
5.insert():向迭代器 it 处插入一个元素,示例:

// vi: 1 2 3 4 5
vi.insert(vi.begin() + 2, -1);//将 -1 插入 vi[2] 的位置
// vi: 1 2 -1 3 4 5

6.erase():两种用法:删除单个元素、删除一个区间内的元素,示例:

// vi: 1 2 3 4 5
vi.erase(vi.begin() + 2);
// vi: 1 2 4 5
// vi: 1 2 3 4 5
vi.erase(vi.begin() + 1, vi.begin() + 3);
//删除 [first, end)
// vi: 1 4 5

四.常见用法
1.储存数据
2.用邻接表储存图

五.题目
1.PAT A1039
思路:
字符串hash + vector数组(防止直接开二维数组内存超限的问题)

代码:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 26 * 26 * 26 * 10 + 10;
vector<int> selectCourse[maxn];
int getID(char name[]) {
	int id = 0;
	for(int i = 0; i < 3; i ++) id = id * 26 + (name[i] - 'A');
	id = id * 10 + (name[3] - '0');
	return id;
}
int main() {
	int sumStudent, sumCourse;
	scanf("%d%d", &sumStudent, &sumCourse);
	int n, m;
	char name[4];
	for(int i = 0; i < sumCourse; i++) {
		scanf("%d%d", &n, &m);
		for(int j = 0; j < m; j++) {
			scanf("%s", name);
			int id = getID(name);
			selectCourse[id].push_back(n);
		}
	}
	for(int i = 0; i < sumStudent; i++) {
		scanf("%s",name);
		int id = getID(name);
		sort(selectCourse[id].begin(), selectCourse[id].end());
		printf("%s %d", name, selectCourse[id].size());
		for(int j = 0; j < selectCourse[id].size(); j++) 
			printf(" %d", selectCourse[id][j]);
		printf("\n");
	}
	return 0;
}

2.PAT A1047
思路:
二维数组保存姓名与姓名序号的关系,vector 数组保存课程序号与姓名序号的关系;

代码:

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 40010;
char name[maxn][5];
bool cmp(int a, int b) {
	return strcmp(name[a], name[b]) < 0;
}
int main() {
	int sumStudent, sumCourse, n, course;
	scanf("%d%d", &sumStudent, &sumCourse);
	vector<int> student[sumCourse + 1];
	for(int i = 0; i < sumStudent; i++) {
		scanf("%s %d", name[i], &n);
		for(int j = 0; j < n; j++) {
			scanf("%d", &course);
			student[course].push_back(i);
		}
	}
	for(int i = 1; i <= sumCourse; i++) {
		int len = student[i].size();
		printf("%d %d\n", i, len);
		sort(student[i].begin(), student[i].end(), cmp);
		for(int j = 0; j < len; j++) {
			int id = student[i][j];
			printf("%s\n", name[id]);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值