为了让学习多点动力,不致于让枯燥的术语和语法规则搅得一头雾水,首先说点STL很提劲的功能,勾起咱们这些个功利主义者的兴趣。
STL是一个泛型程序库。所谓泛型,就是任意的数据类型。你可以把任意的数据类型放在STL的容器里,用STL提供的算法库进行处理。你可以抛开排序、查找、最大/最小值这些算法的代码,也不用从底层构造堆栈、队列、二叉堆、排序二叉树这些数据结构,在STL里,这些都是现成的,直接拿来用就行了。而且,你根本不用怀疑STL中这些代码的正确的,它们是经过多少次实践检验过了,不会犯那种你经常会犯的偶然错误。
当然,STL强大的同时也表明它并不简单。要学好它并非易事。所以嘛,代价总是有的。但关键一点是看付出的代价与获得的利益相比,谁轻谁重。小时候,我做过一题语言阅读题,叫“磨刀不误砍柴功”。我想,不用说内容,你懂的......
首先,介绍一下STL是什么意思。它是英文S.....T......L.......等3个单词的缩写,中文意思是“标准模板库”。我觉得STL无论读起来还是写起来都比“标准模板库”更省力,所以今后在没有歧义的情况下,我都这样称呼了。
STL并不是C++标准库的全部,它只是其中的一部分——非常核心的那个部分。
再看STL的组成(或称组件),最关键是“容器”、“迭代器”、“算法”这3个组件。
所谓容器(Containers),是用来存放和管理对象的器皿。不同的容器存放对象的方法有所不同,造成同一个操作在不同容器上实现的时间效率不一定相同。例如,vector容器访问任一元素的时间是O(1),删除某个位置的元素的时间是O(n)。而list容器则相反,访问任一元素的时间是O(n),删除某个位置的元素的时间是O(1)。因此,我们在选择容器时,就要根据操作的类型与操作次数的多寡来决定最适合的容器类型。
所谓迭代器(Iterators),是用来遍历(或访问)容器中的某个或某一些元素的“指针”。迭代器能够从容器中某个指定的位置开始,访问当前元素(用*运算符),然后以非常简单的方式前进到下一个位置(用++运算符),直到遇到一个结束位置。迭代器的强大之处在于,无论什么类型的容器,是一个线性的vector也好,一个树形的map也罢,都能以一致的方式进行处理。这就为后面的算法组件做到”编写一次算法,就可把它应用到任意容器上“提供了保障。
所谓算法(Algorithm),是出于不同目的进行查找、统计、排序、修改、插入、删除等。许多算法对于所有的容器都适用。而某些容器由于自身的特殊性,专门有一些算法。
关于三个组件的关系,引用一段话:”STL的基本观念是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义之。迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。“
STL设计的一个核心思想是泛型编程。因此,容器和算法看待任意的C++语言内置的基本数据类型(types)和编程者构造的类类型(classes)而言,都是无差别的。