[关闭]
@fcxxzux 2017-01-15T13:03:09.000000Z 字数 2479 阅读 1090

Learning a Part of C++(for ACM/ICPC) (5) STL概览


Finally,花了这么多时间,做足了有的没的的铺垫以后,我们可以开始看看,ACM中有点泛滥的STL了。

这年头,如果没有STL,做题体验会是什么样的呢?

扯了那么多,接下来让我们开始吧。

1、 STL的组成部分

说了这么半天,我都忘了仔细说明STL是什么了……
STL,英文全称Standard Template Library,标准模板库,是一组模板类和模板函数(所以要花时间讲模板……)。

这个模板库提供了:

我们接下来慢慢介绍(只介绍ACM常用的)。

2、STL容器

首先,是顺序容器,这些容器的元素,都是按顺序,线性存储的:

然后是一类可快速查找的容器:

  1. map<string ,int> score;
  2. score["alice"]=95;
  3. printf("Alice's score is %d\n",score["alice"]);

输出:Alice's score is 95
(顺带一提,有个东西叫KV数据库,面试时可能被问到,其实这里的KV就是指key-value,键值对)

最后还有一类容器,封装了一些基本数据结构,包括:

3、STL迭代器

我们现在把数据放进容器里,容器很好的把数据组织起来了。
然后我们怎么去访问这些数据?
vector和map重载了下标运算符,其他的呢?
这个时候,我们需要 迭代器(iterator)
迭代器(iterator)在用起来的时候,和指针非常类似,指向STL容器中的元素,用*来解引用,获取具体元素,可以++ / --来移动到下一个/上一个位置,可以用== !=来判断两个迭代器是否指向同一个位置。
但是,迭代器还是会有一些具体类型的,比如:

具体的应用,和一些注意事项,我们将在之后结合STL容器进行讲解。

4、STL算法

最后我们来简单介绍一下STL算法了。
其实一些简单的算法,STL都帮我们实现了 —— 包括排序、二分,第k大,等等等等。
但是,有那么多不同容器,还有C语言数组,怎么通过一个实现来搞定一切呢?
统一通过迭代器来访问和操作数据就可以了!

还有,不少算法返回的是迭代器,如果你要知道下标的话,可得动手做一下减法。

我们将在下一篇来好好说说这些算法函数。

5、还有2个——string和bitset

最后再提2个类,stringbitset类。

string,顾名思义,字符串类。
我们不是有C语言的字符数组加上'\0'来当字符串挺好的吗,为什么要引入string类?
因为,当我们想把字符串放进set,以及map中当做key的情况下,我们肯定不是单单指针做比较(这样毫无意义),而是要内容做比较。
那么,要内容做比较,怎么办?
A)自己写个结构体/类,里面一个char数组,还要实现小于比较
B)为什么不用现成的实现呢?
这个现成的实现,就是string类了。

bitset,它是一个位向量/位示图的实现。
或者更直白点,这是一个每个元素只用一个bit(位)的bool[],而且还可以玩各种位运算。

两者的具体应用,我们都会在之后讲解。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注