STL

原创 2008年10月03日 10:31:00
 

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 hashmap

全网最全STL hash_map使用讲解 这么
  • u010335911
  • u010335911
  • 2014年05月20日 01:13
  • 2703

STL<vector>用法汇总

使用场合: vector算是一个比较万金油的容器,它是一个可变大小数组,支持随机访问,不过在尾部以外的位置进行增加和删除操作会比较耗时。通常用vector来代替原始的数组来使用,比较方便。 ...
  • weixin_35929051
  • weixin_35929051
  • 2016年09月25日 13:16
  • 1222

STL版本介绍:HP STL、SGI STL、STL Port、PJ STL、RW STL

C++STL的版本实现有很多种,包括:HP STL、SGI STL、STLPort、P.J.Plauger STL和Rouge Wave STL等 一、HP STL。 1.1 设计实现      ...
  • kanguolaikanguolaik
  • kanguolaikanguolaik
  • 2013年09月09日 15:52
  • 2909

STL文件

STL文件的起源美国3D Systems公司于1987年制定了STL (STereoLithography)文件格式,它以小三角面片为基本单位,离散地近似描述三维实体模型的表面.STL 文件最初应用于...
  • Augusdi
  • Augusdi
  • 2014年03月11日 10:52
  • 8116

STL中随机数的调用

由于我们对我们写的程序需要测试数据,为了我们的程序能够经得起任何考验我们采用随机数库不一定没有bug,使用之前测试库是一个好习惯随机数发生器rand()核心函数是#include中的rand()函数他...
  • The_best_man
  • The_best_man
  • 2017年04月17日 20:11
  • 629

STL之queque队列

queue队列容器 一、原理     queue 队列也是一个线性存储表,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出FIFO(First In First Out)...
  • memewry
  • memewry
  • 2012年07月24日 23:55
  • 15135

谈R软件中的STL分解

STL分解基于Loess,即局部加权回归散点平滑法,是1990年由密歇根大学的R. B. Cleveland教授以及AT&T Bell实验室的W. S. Cleveland等人提出来的一种对时间序列进...
  • u012556077
  • u012556077
  • 2015年08月22日 17:16
  • 1761

STL基础篇(适合初学者快速入门)

1.       STL 是什么 作为一个C++ 程序设计者,STL 是一种不可忽视的技术。 Standard Template Library (STL) :标准模板库, 更准确的说是 C++ 程...
  • a20102110080212
  • a20102110080212
  • 2013年09月14日 11:52
  • 2433

stl文件处理

Table of Contents stl文件介绍处理过程源码解析底层类和函数介绍 stl文件介绍 概述 stl文件用三维网格表现实体模型,stl文件有两种...
  • fhln609353626
  • fhln609353626
  • 2015年08月28日 16:31
  • 2046

STL文件操作简介

我们经常整些命令台程序,啥cout>之类的.而实际项目中基本上不会要你用cout啥的在屏幕上输出.而在硬盘上读写文件操作倒很多. 假如没用到MFC或者win API咋去读写文件呢.STL中提供了一些类...
  • weiwenhp
  • weiwenhp
  • 2013年03月20日 17:50
  • 5447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL
举报原因:
原因补充:

(最多只允许输入30个字)