简单地说,标准模板库(STL)是一组模板类和函数,向程序员提供了:
- 用于存储信息的容器;
- 用于访问容器存储的信息的迭代器;
- 用于操作容器内容的算法。
- STL容器:容器是用于存储数据的STL类,STL提供了两种类型的容器类:顺序容器和关联容器。另外,STL还提供了被称为容器适配器的类,他们是顺序容器和关联容器的变种,包含的功能有限,用于满足特殊的要求。
顺序容器:按顺序存储数据,顺序容器具有插入速度快但查找速度相对慢的特征。STL容器包括:
- std::vector------操作与动态数组一样,在最后插入数据;可将vector视为书架,您可在一端添加和拿走图书。
- std::deque------与std::vector类似,但允许在开头插入或删除元素。
- std::list-------操作与双向链表一样,可将它视为链条,对象被连接在一起,可以在任何地方添加和删除元素。
- std::forward_list----类似于std:list,但是单项链表,只能沿一个方向遍历。
关联容器:按指定的顺序存储数据,就像词典一样,这将降低插入数据的速度,但在查询方面有很大优势。STL提供的关联容器包括、:
容器适配器:是顺序容器和关联容器的变种,包含的功能有限,用于满足特殊的要求,主要的适配器类如下。
- std::set------存储各不相同的值,在插入时进行排序;容器的复杂度为对数;
- std::unordered_set----存储各不相同的值,在插入时进行排序;容器的复杂度为对数;这种容器是c++11新增的。
- std::map------存储键-值对,并根据唯一的键排序;容器的复杂度为对数;
- std::unordered_map----存储键-值对,并根据唯一的键排序;容器的复杂度为对数;这种容器是c++11新增的.
- std::multiset----与set类似,但允许存储多个值相同的项,即值不需要时唯一的;
- std::unordered_multiset----与set类似,但允许存储多个值相同的项,即值不需要时唯一的;这种容器是c++11新增的。
- std::multimap-----与map类似,但不要求键是唯一的。
- std::unordered_multimap-----与map类似,但不要求键是唯一的,这种容器是c++11新增的。
2.STL迭代器 :最简单的迭代器是指针。给定一个指向数组中的第一个元素的指针,可递增该指针使其指向下一个元素,还可以对当前位置的元素进行操作。STL中的迭代器是模板类,从某种程度上说,他们是泛型指针。这些模板类让程序员能对STL容器进行操作。注意,操作也可以是以模版函数的方式提供 的STL算法,迭代器是一座桥梁,让这些模板函数能够以一致而无缝的方式处理容器,而容器是模板类。STL提供的迭代器分为两大类。
- std::stack:以后进先出的方式存储元素,能够在栈顶插入和删除元素。
- std::queue:以先进先出的方式存储元素,能够删除最先插入的元素。
- std::priority_queue:以特定顺序存储元素,因为优先级最高的元素总是位于队列开头。
上述两种迭代器可进一步分为三类。
- 输入迭代器:通过对输入迭代器解除引用,它将引用对象,而对象可能位于集合中。最严格的输入迭代器确保只能以只读的方式访问对象。
- 输出迭代器:输出迭代器让程序员对集合执行写入操作。最严格的输出迭代器确保只能执行写入操作。
3.STL算法 :查找、排序、和反转都是标准的编程需求,不应让程序员重复实现这样的要求。因此STL以STL算法的方式提供这些函数,通过结合使用这些函数和迭代器,程序员可对容器执行一些最常见的操作。最常用的STL算法如下所示:
- 前向迭代器:这是输入和输出迭代器的一种细化,它允许输入和输出。前向迭代器可以是const的,只能读取它指向的对象,也可以改变对象,即可读写对象,通常用于单项链表。
- 双向迭代器:是前向迭代器的一种细化,可对其执行递减操作,从而向后移动,通常用于双向链表。
- 随机访问迭代器 :是双向迭代器的一种细化,可将其加减一个偏移量,还可以将两个迭代器相减以得到集合中两个元素的相对距离,通常用于数组。
- std::find:在集合中查找值。
- std:::find_if:根据用户指定的谓词在集合中查找值。
- std::reverse:反转集合中元素的排列顺序。
- std::remove:根据用户定义的谓词将元素从集合中删除。
- std::transform:使用用户定义的变量函数对容器中的元素进行变换。
- 这些都是std命名空间中的模板函数,要使用他们,必须包含标准头文件<algorithm>