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. Android移动网络如何抓取数据包

    1)下载tcpdump工具 tcpdump(dump the traffic on a network)是Linux中强大的网络数据采集分析工具之一,可以将网络中传送的数据包头完全截获下来提供分析.它 ...

  2. thinkjs——art-template模板用法

    前言: 概述之前先附上此正式版介绍地址:https://github.com/aui/artTemplate  or http://www.jq22.com/jquery-info1097,可以再看下 ...

  3. Lua脚本和C++交互(二)

    上一节讲了一些基本的Lua应用,下面,我要强调一下,Lua的栈的一些概念,因为这个确实很重要,你会经常用到.熟练使用Lua,最重要的就是要时刻知道什么时候栈里面的数据是什么顺序,都是什么.如果你能熟练 ...

  4. Receiver type for instance message is a forward

    本文转载至 http://my.oschina.net/sunqichao/blog?disp=2&catalog=0&sort=time&p=3 这往往是引用的问题.ARC要 ...

  5. Android 手机随音乐振动

    想到做一个Android软件可以在播放音乐的同时手机在音量或者音调高的时候振动一下. 等我熟练Android的时候试试...

  6. AJAX同步设置以及请求代码

    全局设置ajax同步 更正一点:这个的同步,针对的是ajax请求的返回,而不是ajax-success返回后所有进行处理后才进行下一步.所以,window.location.href转跳这个在执行的时 ...

  7. 解决 ssh 登录到ubuntu server 慢的问题

    最近在服务器上使用ubuntu系统,服务器上开启sshd服务,在客户端处使用ssh登录到服务器的时候出现卡顿的现象. 在网上搜索了解决方案,主要是: 1. 修改服务器的 /etc/ssh/sshd_c ...

  8. centos7 ubuntu14 添加sudo 权限 ,禁用每次sudo 需要输入密码

    安装完centos7后,默认没有启用sudo,首先应该是对sudo进行设置.sudo的作用就是使当前非root用户在使用没有权限的命令 时,直接在命令前加入sudo,在输入自己当前用户的密码就可以完成 ...

  9. WEB安全番外第六篇--关于通过记录渗透工具的Payload来总结和学习测试用例

    背景: 在WEB安全的学习过程中,了解过了原理之后,就是学习各种Payload,这里面蕴藏着丰富的知识含量,是在基本上覆盖了漏洞原理之后的进一步深入学习的必经之路.无理是Burpsuite还是Sqlm ...

  10. WEB安全第七篇--终结篇考验逻辑思维:逻辑漏洞大汇总(越权、会话逻辑、业务逻辑、暴力破解)

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...