stl ,main staple
STL维护博客公园
STLContent
简介
容器
迭代程序
算法
简介
为什么一开始不叫标准库,而叫标准模板库?原因是它突出了模板的概念(即泛型)。
Stl由三部分组成:容器、迭代器和算法。下面简单介绍一下:
Stl的理念是把数据和操作分开。它由数据容器管理,操作由可定制的算法定义,迭代器充当两者之间的粘合剂。
(*)容器
序列容器:向量、队列、列表
元素的位置取决于插入的时间。
关联容器:集合、多重集合(集合允许元素重复)、映射、多重映射(映射允许元素重复)
元素的位置取决于排序规则。所有内部实现都是二叉树。
其实map也可以看成一个集合,只不过元素是pair,分为key(第一)和value(第二)。另外,only key不允许冲突。多地图甚至可以重复键。
Map可以通过以下方式插入和修改元素,并且可以用作关联数组,这是multimap所不能做到的:
映射字符串,int分数;
分数[詹姆斯]=76;
分数[史蒂文斯]=89;
多个允许键重复,哪个map不可以。
(*)迭代器
迭代器用于在容器内移动,不管容器是数组、链表还是树。因为每个容器都提供了自己的迭代器实现。
Begin()指向第一个元素,end()指向最后一个元素的后面。如果容器为空,begin()==end()。
迭代器只是“容器中某处”的抽象概念。它对它所属的容器一无所知。任何通过迭代器访问容器的算法都不能通过迭代器调用容器类型的成员函数。
尽量用iter!=end()来判断iter end,而不是iterator end(),因为只有vector、deque、list的迭代器支持运算符。
(*)算法
算法不是容器的成员函数,而是和迭代器一起使用的全局函数。
算法成员函数vs
总的来说,算法更通用,成员函数更有针对性。
成员的优势:
如果追求高效率,应该优先选择成员函数。例如,对list使用remove算法不如使用。移除成员函数。
成员的缺点:
一旦改变了另一个容器,程序代码也必须改变。
容器
对于应用程序员来说,容器无疑是STL最有价值的部分。学习容器应该从两个方面着手:
1各种容器的应用
2了解容器的接口
下面列出了各种容器的比较:
搜索元素不一定要使用集合或映射等二叉树结构,而是要具体情况具体分析。
比如元素数量少,直接用vector就好,因为vector的结构是所有容器中最简单的。
如果搜索性能要求极高,不妨使用哈希表。虽然不是在STL里面,但是很多库已经实现了哈希表。关于容器的使用细节,有一些资源可供参考:
网站:http://www.cplusplus.com/reference/stl/
书籍:C标准库6.10
迭代程序
迭代器类别功能提供程序输入迭代器读取前向流输出迭代器写入前向对象插入器前向迭代器读取和写入双向迭代器读取和写入前向和后向列表、集合、多集合、映射、多映射随机访问迭代器读取和写入随机访问向量、队列、字符串、数组
正向迭代器是输入迭代器和输出迭代器的组合,它也可以“驻留”在同一个元素上。
双向迭代器在前向迭代器的基础上,增加了后向遍历的功能,即-运算。
随机访问迭代器可以使用数值索引和比较运算符来比较不同迭代器在同一容器中的位置。
算法
STL提供了几乎所有的常用算法。但这部分内容相对琐碎,最好提前掌握模仿函数、迭代器适配器等高级概念,门槛较高。所以就不深究了,以后再说。
模拟函数见C标准库Ch9。
迭代器适配器见C标准库Ch7.4。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。