目录
输入一个字符串,用map统计每个字符出现的次数并输出字符及对应的次数
一、STL介绍
1.概述
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;
STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)
STL的基本组件:
- 容器,是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
- 迭代器,提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
- 算法,是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
- 函数对象,是重载函数调用操作符的类,其对象称为函数对象(function object),即他们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得类对象可以像函数那样被调用
2.容器
容纳、包含一组元素的对象。
基本容器类模板
- 顺序容器:array(数组)、vector(向量)、deque(双端队列)、forward_list(单链表)、list(列表)
- (有序)关联容器:set(集合)、multiset(多重集合)、map(映射)、multimap(多重映射)
- 无序关联容器:unordered_set (无序集合)、unordered_multiset(无序多重集合) unordered_map(无序映射)、unorder_multimap(无序多重映射)
容器适配器:stack(栈)、queue(队列)、priority_queue(优先队列)
容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成
容器的通用功能:
- 用默认构造函数构造空容器
- 支持关系运算符:==、!=、<、<=、>、>=
- begin()、end():获得容器首、尾迭代器
- cbegin() 、cend():获取容器首、尾常迭代器,不需要改变容器时更加安全
- clear():将容器清空
- empty():判断容器是否为空
- size():得到容器元素个数
- s1.swap(s2):将s1和s2两容器内容交换
相关数据类型(S表示容器类型):
- S::iterator:指向容器元素的迭代器类型
- S::const_iterator:常迭代器类型
3.迭代器
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。
迭代器是算法和容器的桥梁
- 迭代器用作访问容器中的元素
- 算法不直接操作容器中的数据,而是通过迭代器间接操作
算法和容器独立
- 增加新的算法,无需影响容器的实现
- 增加新的容器,原有的算法也能适用
迭代器的分类
箭头表示概念与子概念的关系,例如前向迭代器这一概念是输入迭代器和输出迭代器这两个概念的子概念,也就是说一个前向迭代器肯定是输入迭代器,也肯定是输出迭代器。
输入迭代器:可以用来从序列中读取数据,如输入流迭代器
- istream_iterator<T>
- 以输入流(如cin)为参数构造