阶段学习总结--stl容器

这周对stl有了更深的理解,初步学习了bfs广度优先搜索和dfs深度优先搜索。

vector向量,变长数组,可以动态改变大小,每次数组长度不够时,就会申请原数组的两倍的空间,在元素个数不确定的时候可以很好的节省空间。可以模拟二维数组vector >,可利用下标访问每个元素,但要注意下标越界的问题,如洛谷p3613

vector >a(n+1);
		
if (opt == 1) {
	cin >> i >> j;
	int k;
	cin >> k;
	if (k == 0) a[i][j] = {};
	else {
		if (a[i].size() < j + 1) a[i].resize(j + 1);
		a[i][j] = k;
	}
}

对二维数组进行存储时,需要判断大小是否足够,如果不够则resize扩充容量。注意a.begin()返回的是首元素的地址,a.end()返回的是末元素的下一个位置的地址

string字符串,比char[]的一些操作更简洁快速,拼接直接可以用+=运算符来实现,可用下标访问每个字符,可以用cin cout直接实现一整串字符的输入输出,可用> <来比较大小。

set集合,内部自动排序且不含重复元素的容器,某些题目在需要去重的时候可以新开辟set来完成。multiset保留set功能但不去重,unordered_set保留set功能但不排序。

map映射,map是key键值(type1)与value值(type2)的映射,特例,如果是字符串到整型的映射,不能用char[],只可使用string,因为char[]作为数组,不能作为键值存在。迭代器it,利用it->first访问键值,is->second访问值。map会以键值从小到大的顺序自动排列。键值和值是唯一的,如果需要一个键对应多个值,需要用multimap。常用场景:需要建立字符串与整数之间的映射时;判断数据是否存在时,可把map当作bool数组使用。

stack栈,顶端开口,先进后出的容器。可以用来模拟实现递归,防止程序对栈内存的限制导致程序运行出错(本人目前还未遇到这种题目)。翻转字符串,例如输入“olleh !dlrow” , 输出 “hello world!”对多组字符串进行一一反转,可用reverse,但用栈的特性则会更快。计算后缀表达式,如洛谷p1449。作为dfs的底层实现。

queue队列,两端开口,中间封闭,先进先出的容器。priority_queue,push进的元素会自动排序,使得每次的队首元素都是优先级最大的。可以自己设置结构体的优先级,需要重载运算符(重载直接写在结构体中),注意这里定义的bool类型的重载,与sort中cmp的定义相类似,但效果相反(具体怎么实现的忘记了,记住与cmp函数判断的效果相反就行吧)。

pair,等价于内部有两个元素的结构体,当然也可以实现含两个以上元素以上,如pair,t3>。pair中的两个元素first,second可按结构体的方式进行访问,两个pair进行比较时可以直接用><=,先以first的大小作为标准,first相等时再比较second。常用场景:代替二元结构体及构造函数;作为map的键值对来进行插入(本人暂时未遇到这种题目)

dfs深度优先搜索,以深度作为第一关键词,枚举所有完整路径以遍历所有情况的搜索方法。算法笔记通过用走迷宫来形容深度优先搜索,迷宫的每个岔路口都有两种选择,可以写作递归式,迷宫的死路就是递归的边界。背包问题每个物品都有选与不选两种可能,重量大于容量的情况即死胡同,再通过限制条件达到节省枚举量进而减少时间复杂度(即剪枝),来找到最优方案。

bfs广度优先搜索,以广度作为第一关键词,以走迷宫为例,dfs是遍历、走完所有路径,一条路走到底,而bfs是层层递进,每遇到一个岔路口就枚举它里面的所有下一个路口,类似队列,按层次的顺序进行遍历。背包问题每一个物品选与不选可以用dfs模拟实现,dfs则可以模拟求矩阵中块的个数(记忆中与之前做过的一道扫雷题目相似),判断块是否为1,若为1,则同样查询周围块,直到整个块访问完毕,记录块数。需注意防止越界与重复计算。这样层层递进的题目就可以用bfs来模拟实现。

最后说一下个人在这一周的感受,看书效率>看课,要根据自己的实力阅读对应的资料,多思考多理解,提高效率。说实话这一个周比在家半个月学到的东西还要多...(惭愧啊)

你可能感兴趣的:(算法,数据结构,算法)