STL - MainTao - 博客园

STL

Content

简介

容器

迭代器

算法

简介

首先为什么不叫标准库,而叫标准模板库呢?原因在于它突出模板(即泛型)的概念。

stl由三部分组成:容器,迭代器,算法。下面分别做一个简略介绍:

stl的哲学是将数据和操作分离。数据由容器管理,操作由可定制的算法定义,迭代器充当了两者之间的的粘合剂。

(*) 容器

序列式容器(sequence container): vector, deque, list

元素的位置取决于插入的时机

关联式容器(associative container): set, multiset(允许元素重复的set), map, multimap(允许元素重复的map)

元素的位置取决于排序规则。内部实现方式都是二叉树。

map其实可以看成set,只不过元素是pair,分成了key(first)和value(second),另外只有key不允许冲突。multimap则连key也可以重复。

用map可以用以下方式插入、修改元素,可当作关联数组来使用,这一点multimap做不到:

map<string, int> scores;

scores["James"] = 76;

scores["Stevens"] = 89;

multiple允许key重复,这一点map做不到。

(*) 迭代器

迭代器用来在一个容器内行进,而不管这个容器具体是数组、链表或是树。因为每个容器都提供了自己的迭代器的实现。

begin()指向第一个元素,end()指向最后一个元素的后面。若container为空,则begin() == end()。

迭代器只不过是“容器中某一位置”的抽象概念,它对自己所属的容器一无所知,任何以迭代器访问容器的算法都无法通过迭代器调用容器类型的成员函数。

尽量用iter != end()来判断结尾,而不是iter < end(),因为只有vector, deque, list的迭代器才支持<运算符。

(*) 算法

算法并非容器的成员函数,而是搭配迭代器使用的全局函数。

算法vs成员函数

总的来说,算法更通用,成员函数更有针对性。

成员函数的优点:

如果追求高效率,应优先选用成员函数。例如对list使用remove算法就不如使用.remove成员函数效率高。

成员函数的缺点:

一旦换另一种容器,就不得不更动程序代码.



容器

对应用程序员来讲,容器毫无疑问是STL中最有价值的部分。学习容器应从两个方面入手:

1 各种容器的适用情况

2 了解容器的接口

下面列出了各种容器的比较:

搜索元素并不一定要用set或map之类的二叉树结构,应具体情况具体分析。

例如,若元素个数较少,直接用vector就好,因为vector的结构是所有容器中最简单的。

如果对搜索性能要求极为苛刻,不妨用hash table,虽然它不在STL中,但很多库已经实现了hash table。

关于容器的使用细节,有一些资源可以参考:

网站:http://www.cplusplus.com/reference/stl/

书籍:C++ Standard Library  6.10



迭代器

Iterator Category Ability Providers
Input iterator Reads forward istream
Output iterator Writes forward ostream, inserter
Forward iterator Reads and writes forward  
Bidirectional iterator Reads and writes forward and backward list, set, multiset, map, multimap
Random access iterator Reads and writes with random access vector, deque, string, array

forward迭代器是input和output迭代器的结合,而且还能在同一个元素上“驻留”。

bidirectional迭代器在forward迭代器的基础上增加了回头遍历的功能,即--操作。

random access迭代器能使用数字索引,还能使用比较运算符比较同一容器中不同迭代器的前后位置。


算法

STL提供了几乎所有的常用算法。但这一部分内容相对琐碎,而且最好能预先掌握仿函数、iterator adapter这样的高级概念,门槛较高。所以先不深入了,等以后真用到再说。

仿函数参见C++ standard library Ch9

iterator adapter参见C++ standard library Ch7.4

STL - MainTao - 博客园相关推荐

  1. 博客园电子期刊2013年01月刊发布啦

    期刊访问网址:http://emag.cnblogs.com/2013/CNBlogsEmag201301.html.以下为本期期刊内容: 博客园电子期刊 No61.2013年01月刊 推荐新闻 剥开 ...

  2. 博客园在微信内置浏览器打开时添加微信赞赏码功能

    我的博客开通了赞赏,看右侧悬浮[打赏],很容易弄,文末有链接. 另外,在微信中打开时,博客正文底部增加微信赞赏码,在微信内置浏览器打开时,长按图片识别,直接可以赞赏. 这本人自己摸索的,未参考任何博文 ...

  3. 关于博客园与CSDN博客同步的说明

    把博客园与CSDN比较,我认为博客园有技术内容优势,CSDN有行业资源优势,两者都比较重要.因此在两家网站同步发布博客. CSDN博客地址:http://blog.csdn.net/caoshiyin ...

  4. Python爬虫入门教程 54-100 博客园等博客网站自动评论器

    爬虫背景 爬虫最核心的问题就是解决重复操作,当一件事情可以重复的进行的时候,就可以用爬虫来解决这个问题,今天要实现的一个基本需求是完成"博客园" 博客的自动评论,其实原理是非常简单 ...

  5. 博客园HTML源码运行特制js(原创自Zjmainstay)

    canrun 测试运行HTML <html> <head><title>测试博客园HTML源码运行程序</title><meta http-equ ...

  6. “北京今年入冬的第一场雪”,纪念博客园写日志一年了

    今天是2009年11月1日,北京下了入冬以来的第一场雪,就在昨天我还以为北京还是秋季,可是今天早上醒来看到外面飘落的大雪,已经意识到北京的冬天已经到来了 来博客园写博客一年了,结识了很多朋友,也为社区 ...

  7. 博客园今天早上是不是出现什么问题了?

    下面是我进我的blog后台管理和浏览博客园给出的提示.大约几分钟后恢复正常. 转载于:https://www.cnblogs.com/freeyzh/archive/2004/12/01/71269. ...

  8. Word 2013无法发布文章到博客园

    2018年12月12日突然发现word2013无法发布文章到博客园了, 虽然不常发布博客, 但作为一个强迫症患者, 不折腾好了, 吃肉都不香呀! 删除之前的账户, 想重新注册, 居然遇到了灰色对话框! ...

  9. 【开源】博客园文章编辑器4.0版发布

    源起 最近个人时间多起来了: 于是打算持续写一点东西: 前面写了两篇关于riot.js的东西: 被博客园的领导移出首页了: 原因之一是排版不整齐: 确实是不整齐,这我认, 然而,我自己可是博客园文章编 ...

最新文章

  1. USB供电不足怎么办
  2. 基于simulink的永磁无刷直流电机控制系统的仿真研究
  3. Python统计列表中的重复项出现的次数的方法
  4. oracle之数据处理
  5. linux中脚本引入计算bc,linux BC命令行计算器
  6. [浪风JQuery开发]jquery最有意思的IFrame类似应用--值得深入研究
  7. Caffe 之 使用非图片的鸢尾花(IRIS)数据集(hdf5格式) 训练网络模型
  8. 配置tomcat虚拟机
  9. VSCode使用Windows用户名而不是config中设置的User
  10. python抓取qq空间相册_用Python爬取QQ空间说说和相册!还不让我访问!
  11. 清空SQL数据库日志|数据库开发|SQL|web开发|快速开发|中间件平台|方正飞鸿|ES2007|
  12. POI设置excel格式为文本格式
  13. treemap倒叙_java对map进行排序(对日期倒叙)
  14. windows版本解说之长期服务版缺少应用商店的安装
  15. 计算机手工绘图,你知道做毕业设计的时候为什么一定要有手工绘图呢?
  16. 解释X_train,Y_train,X_test,Y_test分别表示什么
  17. 前端手把手教你js实现附件预览和下载得功能实现
  18. [RK3568 Android11] 开发之APP应用切换USB OTG模式
  19. 用python画象棋棋盘_Python turtle绘画象棋棋盘
  20. 充电桩云平台-一站式运营服务平台

热门文章

  1. awk的基本使用方法
  2. 搜索服务Elasticsearch与Solr比较
  3. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...
  4. 常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别
  5. 《编程之美》1.3一摞烙饼的排序
  6. 有限项加和的极限求解思路定式
  7. Pytorch中的collate_fn函数用法
  8. keras 中 reuse 问题
  9. Javascript:一些基本语法
  10. 51nod1079中国剩余定理