初识STL
STL简介:
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
C++标准模板库的核心包括容器 (Containers)、算法(Algorithms)、迭代器(iterators)三个组件,其中1.容器是用来管理某一类对象的集合,C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等;2.算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作;3.迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。
STL的特点:
STL的一个重要特点是数据结构和算法的分离:
尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;
STL另一个重要特点是它不是面向对象的:
为了具有足够通用性,STL主要依赖于模板而不是封装,继承和多态性——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;
STL组件:
STL 组件主要包括容器,迭代器、算法和仿函数。
容器
容器即用来存储并管理某类对象的集合。
例如鱼缸是用来盛放金鱼的容器。每一种容器都有其优点和缺点。为满足程序的各种需求,STL 准备了多种容器类型,容器可以是 arrays 或是 linked lists,或者每个元素有特别的键值。
迭代器
迭代器用于在一个对象群集的元素上进行遍历动作。对象群集可能是容器,也可能是容器的一部分。
迭代器的主要用途是为容器提供一组很小的公共接口。利用这个接口,某项操作可以行进至群集内的下一个元素。每种容器都提供了各自的迭代器。迭代器了解该容器的内部结构,所以能够正确行进。迭代器的接口和一般指针类似。
算法
用来处理群集内的元素,可以出于不同目的搜寻、排序、修改、使用那些元素。
所有容器的迭代器都提供一致的接口,通过迭代器的协助,算法程序可以用于任意容器。
STL 的一个特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。
STL 的另一个特性即组件可以针对任意型别运作。“标准模板库”这一名称即表示“可接受任意型别”的模板,并且这些型别均可执行必要操作。
在 STL 中,容器又分为序列式容器和关联式容器两大类,而迭代器的功能主要是遍历容器内全部或部分元素的对象。迭代器可划分为 5 种类属,这 5 种类属归属两种类型:双向迭代器和随机存取迭代器。
SIL 中提供的算法包括搜寻、排序、复制、重新排序、修改、数值运算等。
仿函数
STL中大量运用了仿函数。仿函数具有泛型编程强大的威力,是纯粹抽象概念的例证。
STL之容器与算法:
容器
STL 包含诸多容器类。容器类是可以包含其他对象的类,就像数组和队列堆栈等数据结构包含整数、小数、类等数据成员一样。STL 可以包含常见的向量类、链表类、双向队列类、集合类、图类等,每个类都是一种模板,这些模板可以包含各种类型的对象。
下述代码是常用的 vector 赋值方法:
vector <int> l;
for (int i =0;i <100;i++ )
l.push_back (i);
下述代码采用 map 容器进行二维元素的管理:
map <string, string, less <string>> cap; //按从小到大排序
cap ["Ark"] ="Little Rock";
cap ["New"] ="Albany";
map 类似于二维数组,但比二维数组灵活得多。
目前,STL 中已经提供的容器主要如下:
- vector :一种向量。
- list :一个双向链表容器,完成了标准 C++ 数据结构中链表的所有功能。
- queue :一种队列容器,完成了标准 C++ 数据结构中队列的所有功能。
- stack :一种栈容器,完成了标准 C++ 数据结构中栈的所有功能。
- deque :双端队列容器,完成了标准 C++ 数据结构中栈的所有功能。
- priority_queue :一种按值排序的队列容器。
- set :一种集合容器。
- multiset :一种允许出现重复元素的集合容器。
- map <key, val>:一种关联数组容器。
- multimap <key, val>:一种允许出现重复 key 值的关联数组容器。
以上容器设计高效,还提供了接口。程序员可以在任何适当的地方使用它们。
容器可以分为序列式容器和关联式容器两大类。序列式容器主要有 vector、list 和 deque;关联式容器包括 set、map、multiset 和 multimap 等容器模板类。
算法
STL 提供了非常多的数据结构算法。这些算法在命名空间 std 的范围内定义,通过包含头文件 <algorithm> 来获得使用权。
常见的部分算法如下:
- for_each();
- find();
- find_if();
- count();
- count_if();
- replace();
- replace_if();
- copy();
- unique_copy();
- sort();
- equal_range();
- merge();
STL 中的所有算法都是基于模板实现的。