一、STL简介

1、STL(Standard Template Library,标准模板库)是C++标准库最主要和最重要的组成部分。其重要作用在于:

  (1)它可以用来创建动态增长和减小的数据结构;

  (2)它是类型无关的,因此具有很高的可复用性;

  (3)它在编译时而不是运行时进行数据类型检查,保证了类型安全;

  (4)它是平台无关的,因此保证了最大的可移植性;

  (5)它还可用于基本数据类型,包括指针和引用,这对那些必须使用类层次结构来构造应用程序的语言来说是没法比的。

2、STL是一个标准规范,只定义了上层访问接口和组件间一般规则,而没有定义组件底层的实现方式:

3、STL组件:

4、 STL头文件:
  (1)容器类:

  

  (2)泛型算法:<algorithm>,<utility>

  (3)迭代器:<iterator>

  (4)数学运算库:

 

  (5)通用工具:

  (6)其他:

5、容器设计原理——容器就是 能够容纳其他对象作为其元素 的对象。

6、STL容器设计模型:

7、存储方式和访问方式:

  (1)向量(vector)和链表(linked list)是两种最基本的动态结构,也是STL中两种最基本的容器,分别对应动态数组和链接表结构,同时它们分别代表了内存中同类型批量数据存放的两种基本方式:连续存储——随机访问,随机存储(不连续存储)——顺序访问。

8、顺序容器和关联式容器的比较:

9、存储空间重分配问题:

  (1)在创建一个容器时能够预先估计出它可能存放的最大元素数目,预先分配足够数量的存储空间;

  (2)尽量在容器的尾部执行插入操作,因为这里的插入操作效率最高。

10、对象作为STL容器元素需要满足的条件:

11、迭代器——STL中容器元素对象的位置指示器(可以理解为一种泛型指针或通用指针,但切不可把迭代器与void*和基类指针这样的通用指针混淆——指针代表真正的内存地址,即对象在内存中的存储位置;而迭代器则代表元素在容器中的相对位置)

简而言之,迭代器是为了降低容器和泛型算法之间的耦合性而设计的,泛型算法的参数不是容器,而是迭代器。

12、STL迭代器分为5个类别:

  (1):

  (2):

  (3):

13、迭代器失效及其危险:

14、"容量","容器"和"有效元素"

注意:

  (1)除了调用容器的某些方法可以改变容器的大小(注意,是容器,不是容量;容器大小存放着有效元素。)外,在容器外部没有任何方法可以做到这一点。因此如果想使用迭代器在冗余容量(冗余容量不属于容器)的空间上通过赋值来给容器增加元素,结果一定会让你失望。如下程序:

  (2)也可以使用resize改变容器大小:

  (3)尽量不要在遍历容器的过程中对容器进行插入元素、删除元素等修改操作,这和不要在for循环中修改计数器是一个道理,特别是连续存储的容器中。因为这些操作会使一些迭代器失效,特别是当前迭代器,这在效果上等价于修改了循环计数器。

  (4)修改容器和修改容器中的元素对象的值是两码事。

15、存储分配器

16、适配器:

  (1)容器适配器:

  STL定义的迭代器适配器并不都是像容器适配器那样去改变另一个迭代器的接口,而是具有特殊的设计和特殊的用途。(插入式迭代器,输出流迭代器,输入流迭代器,反向迭代器)。函数对象及其迭代器比较复杂,这里不讨论。

17、泛型算法:(泛型算法<——>迭代器<——>容器)

(1)概念:

(2)泛型算法参数:

18、特殊容器:

  (1)string类

  

  (2)bitset并非set

  (3)

19、空容器和容器元素判断

  (1)由于容器的独特存储机制,使得容器可以是空的,而不像组那样不能为空。可以使用empty()方法来检查。

从容器中删除元素前一定要检查该元素是否属于该容器:

注意:

容器可以为空,容器为空的时候,容器对象依然存在,只不过容器里面的元素对象个数为0;

但数组不可为空,数组为空时,数组对象便不再存在了。

20、STL容器特征总结:

21、推荐阅读:

  (5)本博客摘自《高质量程序设计指南——C++/C语言,第三版》

  (6)C++模板详解

结语:参观飞机工厂不能让你学到流体力学,也不能让你学会开飞机。然而如果你会开飞机又懂流体力学,参观飞机工厂可以带给你最大的乐趣和价值。

  

STL概论的更多相关文章

  1. STL——配接器(adapters)

    一.配接器 <Design Patterns>一书提到23个最普及的设计模式,其中对adapter样式的定义如下:将一个class的接口转换为另一个class 的接口,使原本因接口不兼容而 ...

  2. STL 源码分析 (SGI版本, 侯捷著)

    前言 源码之前,了无秘密 algorithm的重要性 效率的重要性 采用Cygnus C++ 2.91 for windows cygwin-b20.1-full2.exe 下载地址:http://d ...

  3. Archives: 2018/11

    There are 35 posts in total till now. 11月 11, 2018 HTTP 11月 11, 2018 TCP与UDP 11月 10, 2018 Python测试 1 ...

  4. 05-STL

    Day01 笔记 1 STL概论 1.1 STL六大组件 1.1.1 容器.算法.迭代器.仿函数.适配器.空间配置器 1.2 STL优点 1.2.1 内建在C++编译器中,不需要安装额外内容 1.2. ...

  5. 史上最全的各种C++ STL容器全解析

    史上最全的C++ STL 容器大礼包 为什么\(C++\)比\(C\)更受人欢迎呢?除了\(C++\) 的编译令人感到更舒适,\(C++\)的标准模板库(\(STL\))也占了很重要的原因.当你还在用 ...

  6. C++ STL bitset 容器详解

    C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...

  7. 《STL源码剖析》——第一、二、三章

     第一章:概论: 换句话说,STL所实现的,是依据泛型思维架设起来的一个概念结构.这个以抽象概念(abstract concepts)为主体而非以实际类(classes)为主体的结构,形成了一个严谨的 ...

  8. Atitit.研发团队与公司绩效管理的原理概论的attilax总结

    Atitit.研发团队与公司绩效管理的原理概论的attilax总结 1. 四个理念 1 1.1. 绩效管理的三个目的.四个环节.五个关键2 1.2. 绩效目标smart2 2. 考核对象2 3. 绩效 ...

  9. Atitit.软件研发团队建设原理与概论 理论

    Atitit.软件研发团队建设原理与概论 理论 培训 团队文化建设(内刊,ppt,书籍,杂志等) 梯队建设 技术储备人才的问题 团队建设--小红花评比. 团队建设--文化墙.doc 户外拓展 1. 团 ...

随机推荐

  1. C语言中内存分配问题:

    推荐: C语言中内存分配 Linux size命令和C程序的存储空间布局 本大神感觉,上面的链接的内容,已经很好的说明了: 总结一下: 对于一个可执行文件,在linux下可以使用 size命令列出目标 ...

  2. 容易出错的 if 语句

    下面列举几个容易出错的if语句实例,如果后续还有新的发现,还会继续更新! 出错一:在括起控制表达式的括号后面加分号 ; ); printf("值为正"); 初次运行,感觉一切正常, ...

  3. Xianfeng轻量级Java中间件平台:属性管理、字典管理

    属性管理:主要功能是维护一些系统定义的.业务定义的属性数据,至于属性是什么,简单的说就是由键key和值value组成的数据,属性查询列表页面如下: 表格实现了直接编辑的功能 字典管理:主要功能是维护一 ...

  4. dubbox 的各种管理和监管[转]

    dubbo官方自带了dubbo-admin及dubbo-simple/dubbo-monitor-simple二个子项目用于服务治理及服务监控. 一.dubbo-admin的部署 这个比较简单,编译打 ...

  5. c++ windows下计时

    多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 陈硕Blog.csdn.net/Solstice 自从 Intel Pentium 加入 RDTSC 指令以来,这条指令是 micro ...

  6. myeclipse中项目上传到cvs注意事项

    上传工程时检查cvsignore文件,如果有该文件直接删掉再上传.这样才能保证下载下来的文件保持原上传的目录结构.

  7. iOS: crush when save Core Data

    如果一个页面拥有一个 NSFetchedResultsController 的引用,那么在这个界面将要结束时,一定要 remove 它的 observer - (void)dealloc { //.. ...

  8. Oracle统计每条数据的大小

    怎么查询一条记录到底占了多少空间呢,随便用一个表举例(如上图),就着解决眼前问题的原则(oracle),网上简单查了查,发现生效了,就没深入了解了,包括其它数据库怎么解决,都没做研究.Oracle下, ...

  9. 2. 自动化运维系列之Cobbler给Openstack节点安装操作系统。

    preface 我们在一篇博文知道了如何搭建Cobbler,那么下面就通过Cobbler来安抓Openstack所有节点吧. 服务器配置信息如下: 主机名 IP 角色 Cobbler.node.com ...

  10. mysql add foreign key 不成功

    今天修改了mysql数据表的结构,然后添加外键index一直不成功: 查到问题在于,被外键的表,引擎不是Innodb,而是MyISAM. 修改好,以后保存报错: 解决办法,将数据库表里的数据全部删除, ...