1.概述

STL是通用类模版和算法的集合,它提供给程序员一些标准的数据结构和算法的实现。STL三大关键组成:

  • 容器(Containers),用来管理类对象的集合
  • 迭代器(Iterators),用来在一个对象群集的元素上进行遍历动作。迭代器的主要好处是,为所有容器提供了一组很小的公共接口,利用这个接口,某项操作就可以行进至群集的下一个元素。迭代器的接口和一般的指针差不多,以operator++累进,以operator*提取所指的值。
  • 算法(Algorthms),用来处理群集里的元素。

STL的基本观念就是将数据操作分离。数据由容器类别加以管理,操作则由可定制的算法定义之,迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。

2、容器

STL容器分为两类:

  • 序列式容器(Sequence containers) 可序群集,其中每个元素均有固定的位置--取决于插入时机和地点,和元素值无关。

    vector

    deque

    list

    为序列式容器。

  • 关联式容器(Associative containers) 以序群集,元素位置取决于特定的排序准则。位置取决于元素值,和插入次序无关。

    set

    multiset

    map

    multimap

    为关联式容器。

    关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用来比较元素值(value)或元素键值(key)。缺省情况下以operator<进行比较,可以定义自己的比较准则。

3、迭代器

迭代器是一个“可遍历STL容器内全部或部分元素的对象”,一个迭代器用来指出容器中的一个特定的位置。

基本操作如下:

(1) operator* 返回当前位置上元素的值

(2) operator++ 将迭代器前进至下一元素

(3) operator== 和 operator!= 判断两个迭代器是否指向同一位置。

(4) operator= 为迭代器赋值

所有容器类别都提供有一些成员函数,使我们得以获得迭代器并以之遍历所有的元素,这些函数中最重要的是:

begin()

返回一个迭代器,指向容器的起点

end()

返回一个迭代器,指向容器的结束点,结束点在最后一个元素之后。

注:begin()end()形成了一个半开区间,空区间的begin()等于end()

迭代器的型别:

(1)container::iterator 读写模式遍历元素

(2)constainer::const_iterator "只读"模式遍历元素

迭代器分类

(1)双向迭代器

双向迭代器可以双向行进,以递增运算或以递减运算后退。

list set multiset map multimap提供的迭代器都属此类。

(2)随机存储迭代器

不但具备双向迭代器的所有属性,还具备随机访问能力。

vector deque和string所提供的迭代器都属此类。

注:关于迭代器的使用有一个效率问题

list<char>::iterator pos;
for (pos = coll.begin(); pos != coll.end(); ++pos)
{
...
} for (pos = coll.begin(); pos != coll.end(); pos++)
{
...
} //OK but slower

++pospos++的效率高,因为后者需要一个额外的临时对象来存放迭代器的原本位置并将它返回,所以一般情况下最好使用++pos

4、算法

算法并非容器类别的成员函数,而是一种搭配迭代器使用的全局函数。所以STL更多体现的是泛型式编程思维模式(generic functional programming paradigm),而不是面向对象模式(OOP paradigm).

注意:

(1)所有的算法都用来处理一个或多个区间内的元素,所以我们必须将区间首尾当做两个参数传给算法。调用者必须保证这个区间的有效性。

(2)所有算法处理的都是半开区间 [begin, end )。

(3)如果某个算法用来处理多个区间,那么当你调用它时,务必确保第二(以及其它)区间所拥有的元素个数,至少和第一区间的元素个数相同。

5、总结

  • STL的容器、迭代器、算法都是templates,因此可以操作任何型别,不论是STL预先定义好的或者是用户自行定义的都可以。

    STL容器元素必须满足的三个基本要求:

    (1)必须可以通过copy构造函数进行复制

    (2)必须可以通过assignment操作符完成赋值动作

    (3)必须可以通过析构函数完成销毁动作

  • STL只支持value语意,不支持reference语意。

  • STL的设计原则是效率优先,安全次之。错误检查相当花时间,所以STL几乎没有错误处理。所以对操作人员来说,要自己保证使用 STL 的正确性,或者自己增加一层包装来实现STL的安全性。

  • STL不是线程安全的。

STL学习笔记---STL简介的更多相关文章

  1. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  2. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  3. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  4. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  7. Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

    Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...

  8. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  9. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

随机推荐

  1. oracle客户端免安装配置、64位机器PL/SQL和VS自带的IIS连接问题

    一.oracle客户端免安装配置 1.到oracle官网下载Oracle InstantClient, 把它解压缩到单独目录,例如C:\OracleClient,2. 添加环境变量 ORACLE_HO ...

  2. C# Smtp方式发送邮件

    //简单邮件传输协议类             System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();        ...

  3. ios开发之 -- 自动轮播图创建

    这里是oc版本的,简单记录下: 具体代码如下: 1,准备 #define FRAME [[UIScreen mainScreen] bounds] #define WIDTH FRAME.size.w ...

  4. shell基础篇(三)--引号

    ---今天篇幅比较少:只介绍引号. shell中的引号有三种:双引号",单引号',反引号`1. 双引号:由双引号括起来的字符,除$.倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作 ...

  5. 在properties.xml中定义变量,在application.xml中取值问题

    如果为application.xml中的变量赋默认值,同时又在properties.xml中变量赋值,而加载后是取不到properties.xml中的值的问题. 解决这个问题需要加上黑体部分配置: & ...

  6. 虚拟机 搭建LVS + DR + keepalived 高可用负载均衡

    一:环境说明:   LVS-DR-Master:    10.3.0.82   LVS-DR-Backup:    10.3.0.70   VIP:                10.3.0.60  ...

  7. iOS富文本组件的实现—DTCoreText源码解析 数据篇

    本文转载 http://blog.cnbang.net/tech/2630/ DTCoreText是个开源的iOS富文本组件,它可以解析HTML与CSS最终用CoreText绘制出来,通常用于在一些需 ...

  8. js插件---->jquery通知插件toastr的使用

    toastr是一款非常棒的基于jquery库的非阻塞通知提示插件,toastr可设定四种通知模式:成功,出错,警告,提示,而提示窗口的位置,动画效果都可以通过能数来设置.toastr需要jquery的 ...

  9. Centos7 安装zabbix3.0 服务端 详细

    参考: https://www.cnblogs.com/37yan/p/6879218.html http://blog.csdn.net/hao134838/article/details/5712 ...

  10. MySQL Server has gone away报错原因汇总分析(转自:http://cenalulu.github.io/mysql/mysql-has-gone-away/)

    原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...