如何学好STL:正确的学习姿势,以及,熟能生巧。
1.STL是什么?
STL是Standard Template Library的简称,中文名标准模板库
。简单来说就是封装好的一些组件。主要有容器(containers)和算法(algorithms)
两部分。
2.C with STL
是什么?
字面意思,一般来说程设竞赛或程设考试用得上的C++部分其实就是C+STL,有了《C语言程序设计》和《数据结构》这两门课程的基础,学习C+STL并非难事。
3.为什么要学STL呢?
方便。比如你要实现一个链式队列,以及它的一系列功能,你需要敲几十乃至上百行代码,还要投入精力debug,可在STL里,给你做好现成的queue你用不用?现成的快排你用不用?平均复杂度O(nlogn)
的排序只要几句话,手写一个冒泡也得好几行吧?还卡时。
4.我有兴趣了,怎么学呢?
正确的学习姿势,以及,熟能生巧。
下面步入主题。
1.swap
(交换两元素值,在algorithm下,用法:swap(a,b);)
交换两元素的值在C语言课上作为指针讲解的典例。
1 | int a=1,b=2; |
2.sort
(对序列进行排序,在algorithm下)
1 | //数组排序: |
使用sort是一个越用越活的过程,你要喜欢,还能用:
1 | sort(a,a+10,greater<int>()); |
sort的平均时间复杂度是O(nlogn)
。
3.reverse
(翻转序列,在algorithm下)
1 | //常用在字符串上 |
4.min,max
(取大,取小)
1 | int a=1,b=2,c; |
5.__gcd
(这东西想必大家都不陌生了)
1 | 手写gcd函数也行,这里介绍一下用法。 |
6.lower_bound
和upper_bound
(二分查找)
功能:
我们来看看百度百科的解释
lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个不小于value 的值。
意思就是:找到第一个位置,使得:在这个位置插入value后,原有序序列依旧有序。
这是lower_bound,那upperbound的效果呢?
找到最后一个位置,使得:在这个位置插入value后,原有序序列依旧有序。
用法如下(上面讲了upper的不同,下面只拿lower做样例,不赘述upper):
1 | //数组 |
7.next_permutation
(排列)
1 | 通常用于生成序列的全排列。 |
8.unique
(去重)
1 | 如何把序列 a 中的重复元素去除呢? |
9.random_shuffle
(随机打乱序列,2018.6.25添加)
1 | 对于一个数组a,我想打乱它原有的顺序,那么可以用该函数。 |
上面这些提到的函数都是些基础吧,不定期更新。
2018.5.8更新了一部分函数。
下面开始介绍一些好用的容器。
1.vector
1.1 vector(不定长数组,向量)。
1.2 我们有数组,为什么还要用vector呢?
菜刀可以削皮,削皮刀也可以削皮;菜刀可以切丝,切丝器也可以切丝。菜刀这么多用处,那我们为什么还要用削皮刀和切丝器呢?每种不同的数据结构在不同场合下能发挥出不同的作用。(致敬eric)
1.3实例:邻接表
1 | 下面就以邻接表为例展开介绍。 |
2.set
(集合)
2.1 集合中的元素有三个特征:
1.确定性(集合中的元素必须是确定的)。
2.互异性(集合中的元素互不相同)。
3.无序性(集合中的元素没有先后之分)。
2.2 set容器是由红黑树实现的。在这里我们尽量把STL容器当作黑箱子使用,不需要知道原理,会用就行。
2.3 由于set的一些特性,我们可以用来做一些特定的工作。十分方便。
1 | 2.4 主要函数的使用方法 |
待更
前几天更新过,由于浏览器故障没能保存,今天再更新一次吧。–2018.5.8
删改了部分非书面或者有错误的描述。
3.map
(映射)