3.20训练周记

这周课上主要讲了部分stl的基本操作,stl把数据结构封装起来,并提供了一些函数接口给我们调用实现数据结构的操作。

其实stl上学期就接触了,这次再次学习stl我认为不应该再只局限于记住这些函数的用法,这些用法看似繁杂,实际都可以从命名和该数据结构的特性推出。我认为现在更应该的是去思考这些数据结构应当在什么时候使用,和一些只有在实践才能了解到的细节。

如,之前用queue写广搜的时候,发现有些题老是爆内存,一直没想明白为什么,去查了相关资料才知道queue的pop只返回并“弹出”该元素,但是不释放这个位置的内存(容量)。

比较快捷的解决方法就是用list或者vector模拟队列,不过list听说效率不高,vector要记得补写一个pop_front来模拟队列的出列操作。vector自己也有pop_back和push_back的操作也可以用于模拟stack,而且vector内部封装了比较完整的迭代器操作,可以更灵活的解题。

还有一些不方便替代的stl,比如map和set(unordered set)内部封装了一个高效率的平衡二叉树,想要手写是很 困难的。所以可以多熟练这两个stl的操作。同时练习的时候发现这些stl的迭代器操作不是很好用,可以自己重载一些迭代器操作,比如常用的基本运算it+n之类的,不过要注意重载的复杂度为O(n),运算数过大的时候可以要考虑其他算法了。

这些操作和用法打算过段时间和stl基本操作一起总结一下,现在回到这周学习的stl。

queue和priority_queue ——queue不用说,最大特点先进先出,在广搜和二叉树层序遍历和一些特定场景用途很广。优先队列priority_queue,每次在队首按用户设置的优先级要求greater来保证每次的队首元素都是优先级最大的。. 可以用来解决一些贪心问题(根据优先级),也可以对 Dijkstra 算法进行优化(优先队列的本质是堆)。

还有个人比较常用的vector各种函数用法随便一搜就是,不在赘述。

vector的定位是动态数组,在超过当前vector容器的大小时会自动开辟空间实现动态存储,但是要注意vector的动态开辟,不是在原有的内容上添加新元素,而是拷贝原有的元素,并重新在内存中找出一个足够大的空间复制原有的元素并添加新元素,这就导致了如果频繁动态扩容,vector的效率非常底下,因为每次都要拷贝一次原有的内容。所以使用时可以先像静态数组一样先声明一个足够的容量,然后再进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值