一、STL概述
1.
STL
是
C++
标准程序库的核心,深刻影响了标准程序库的整体结构
STL
由一些可适应不同需求的
集合类(
collection class
)
,以及在这些数据集合上操作的
算法(
algorithm
)
构成
STL
内的所有组件都由
模板(
template
)
构成,其元素可以是
任意类型
STL
是所有
C++
编译器和所有操作系统平台都支持的一种库
2.STL组件
Ø容器(
Container) - 管理某类对象的集合
Ø迭代器(
Iterator) - 在对象集合上进行遍历
Ø算法(
Algorithm) - 处理集合内的元素
Ø容器适配器(
container adaptor
)
Ø函数对象(
functor
)
3.
STL
容器类别
Ø序列式容器-排列次序取决于
插入时机和位置
Ø关联式容器-排列顺序取决于
特定准则
4.STL容器的共同能力
Ø所有容器中存放的都是
值而非引用。如果希望存放的不是副本,容器元素只能是指针。
Ø所有元素都形成一个次序(
order),可以按相同的次序一次或多次遍历每个元素
5.STL容器元素的条件
Ø必须能够通过
拷贝构造函数进行复制
Ø必须可以通过
赋值运算符完成赋值操作
Ø必须可以通过
析构函数完称销毁动作
Ø序列式容器元素的
默认构造函数必须可用
Ø某些动作必须定义
operator==
,例如搜寻操作
Ø关联式容器必须定义出
排序准则,默认情况是重载
operator<
6.
STL
容器的共同操作
Ø与大小相关的操作(
size operator)
size()-返回当前容器的元素数量
empty()-判断容器是否为空
max_size()
-返回容器能容纳的最大元素数量
Ø比较(
comparison)
==,!=,<,<=,>,>=
比较操作两端的容器必须属于同一类型
如果两个容器内的所有元素按序相等,那么这两个容器相等
采用字典式顺序判断某个容器是否小于另一个容器
二、STL容器
1.map/multimap
Ø使用平衡二叉树管理元素
Ø元素包含两部分
(
key,value)
,
key
和
value
可以是任意类型
Ø必须包含的头文件
#include<map>
Ø根据元素的
key自动对元素排序,因此根据元素的
key
进行定位很快,但根据元素的
value
定位很慢
Ø不能直接改变元素的
key,可以通过
operator []直接存取元素值
Ø
map
中不允许
key
相同的元素,
multimap允许
key相同的元素
2.
set/
multiset
Ø使用平衡二叉树管理元素
Ø集合
(Set)
是一种包含已排序对象的关联容器。
Ø必须包含的头文件
#include<set>
Ø
map
容器是键
-
值对的集合,好比以人名为键的地址和电话号码。相反地,
set
容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用
set
容器是最合适的。
Ø
set
中不允许
key
相同的元素,
multiset允许
key相同的元素
三、列子
e.g.
n
比赛又开始了。看见到处都是气球升起,多激动啊!告诉你一个秘密:裁判正在非常开心地猜测哪一题最受欢迎。当比赛结束时,他们统计每种颜色气球的数量就知道结果了。
n
输入
输入有多组测试例。
对每个测试例,第一个数字是N(0<N<1000),表示气球的数量。接下来N行,每行是一个气球的颜色,由小写字母构成的字符串表示,长度不超过15个。当N=0时,表示输入结束。
n
输出
对每个测试例输出一行,
是表示最受欢迎的题目的气球颜色。
是表示最受欢迎的题目的气球颜色。
四、Algorithm(算法)
1.
泛型算法通则
Ø所有算法的前两个参数都是一对
iterators
:[
first,last),用来指出容器内一个范围内的元素。
Ø每个算法的声明中,都表现出它所需要的最低层次的
iterator
类型。
2.变序列的算法
template<class FwdIt>
FwdIt unique(FwdIt first, FwdIt last);
用 == 比较是否相等
template<class FwdIt, class Pred>
FwdIt unique(FwdIt first, FwdIt last, Pred pr);
用 pr 比较是否等
去除[first,last) 这个升序序列中的重复元素
返回值是迭代器,指向元素删除后的区间的最后一个元素的后面