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. ros论坛

    ros:http://ros.gaitech.net/forum.php makefile:http://blog.csdn.net/shallnet/article/details/38070745 ...

  2. Ubuntu16.04下Mongodb(离线安装方式|非apt-get)安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 说在前面的话  首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...

  3. c# 以二进制读取文本文件

    using System; using System.IO; public class FileApp {     public static void Main()     {         // ...

  4. mybatis由浅入深day02_4多对多查询_多对多查询总结

    4 多对多查询 4.1 需求(查询用户及用户购买商品信息) 查询用户及用户购买商品信息. 4.2 sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关 ...

  5. MVC源码

    http://aspnetwebstack.codeplex.com/ MVC源码

  6. Linux环境下$开头的相关变量的含义

    $0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个.$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID号)$! 执行上 ...

  7. Python tips: 什么是*args和**kwargs?

    推荐查看:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00137473844 ...

  8. N76E003学习之路(二)

    最近一直在想N76E003和STM8M003的对比情况,在网上找了不少资料,看了不少文档,具体总结如下: STM8S003F3P6:一共20个脚,最多支持16个GPIO,支持16个外部中断:2个16位 ...

  9. 检测你的php代码执行效率

    在写程序的时候,经常会为是改用empty()还是isset好,或是用单引号还是双引号来显示连接字符串而发出疑问,现在好了.我们其实可以通过程序很科学的得出精确的答案.知道我们的程序到底怎样写效率会更好 ...

  10. EF更新的时候出错

    错误提示: 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectStateManager 项. 说明: 执行当前 Web 请求期间,出现未经处理的异常. ...