C++必知必会(四) STL

对STL(Standard Template Library)的简短描述并不足以体现其设计上的过人之处,接下来的文字不过是鼓励你深入学习STL的“开胃小菜”。

STL并不仅仅是一个库,它更是一种优秀的思想以及一套约定。 STL包含三大组件:容器、算法和迭代器。容器用于容纳和组织元素;算法执行操作;迭代器则用于访问容器中的元素。这些都不是什么新东西,许多传统的程序库也都包含类似的组件,并且许多程序也都是采用模板实现而成。

STL的优秀思想在于:容器与容器上执行的算法之间无需彼此了解,这种戏法是通过迭代器实现的。 迭代器类似于指针(实际上指针就是一种STL迭代器)。像指针一样,迭代器可以指向序列中的一个元素,也可以对其进行解引用,以便获得它所指向的对象的值。我们可以像操纵指针那样操纵迭代器,使其指向序列中不同的元素。

STL迭代器既可以是预定义的指针,也可以是用户自定义的类类型,当然,这种类型需要重载适当的操作符,以便与预定义指针拥有相同的使用语法。

STL容器是对数据结构的一种抽象,以类模板的方式实现而成。由于具有不同的数据结构,因此不同的容器以不同的方式来组织元素,以便对存取或操纵进行优化。STL定义了7个(算上string则是8个)标准容器,另外,一些被广泛接受的非标准容器也得到了实现。

STL算法是对函数的一种抽象,采用函数模板实现。大多数STL算法用于处理一个或多个序列的值,其中每一个序列由一对有序的迭代器定义。其中第一个迭代器指向序列的第一个元素,第二个迭代器则指向序列最后一个元素之后的那个位置。如果两个迭代器指向同一个位置,那么它们就定义了一个空序列。

迭代器提供了一种使容器和算法协同工作的机制。一个容器可以生成一对迭代器来指定一个元素序列(可以是全部元素,也可以只是一个子区间),而算法则对该序列进行操作。采用这种方式,容器和算法可以紧密地协作,同时还可以保持彼此不知情。 除了容器、算法和迭代器之外,STL还定义了大量的辅助性功能。算法和容器可以采用函数指针和函数对象根据需要进行定制,而这些函数对象又可以通过形形色色的对象适配器进行配接和联合。

容器也可以利用容器适配器进行配接,从而将容器的接口修改为栈、队列和优先队列。 STL对约定有着很强的依赖。容器和函数对象必须通过一套标准的嵌套类型名字对其自身进行描述。容器和函数对象适配器均要求成员函数具有特定的名字并包含特定的类型信息。算法要求传递给它的迭代器支持特定的操作并能够识别是什么样的操作。当使用或扩展STL时,如果弃约定而不顾,那么同时也就放弃了美梦成真的希望。遵守约定,将拥有简单而轻松的生活。

STL约定并未指明具体的实现细节,但对实现指定了效率方面的约束。此外,由于STL是一个模板库,许多优化和性能调整可以在编译期进行。前面提到的命名和信息约定对编译期优化具有显著的影响。一般而言,STL的效率可以与专家手写代码的效率相媲美,而与普通程序员和程序员小组的手写代码相比则明显胜出一筹。另外,使用STL可以使代码变得更清晰,更易于维护。 学习STL,并广泛使用STL吧!

时间: 2024-11-03 20:44:59

C++必知必会(四) STL的相关文章

MYSQL必知必会读书笔记第四章之检索数据_Mysql

MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 使用Select语句返回的数据,可能会发现显示的数据会与其他的地方顺序不同.出现这种情况很正常.如果没有明确排序查询结果.则返回的数据没有特殊意义.返回数据的顺序可能是是数据被添加到表中的顺序,也可能不是.只要返回相同数目的行,就是正常. 注意:SQL语句和大小写 请注意,SQL语句不区分大小写,因此select和SELECT是相同的.同样,

【web必知必会】—— DOM:四个常用的方法

终于开始复习DOM的知识了,这一阵忙乎论文,基本都没好好看技术的书. 记得去年实习的时候,才开始真正的接触前端,发现原来JS可以使用的如此灵活. 说起DOM就不得不提起javascript的组成了,javascript是由三部分组成的: 1 ECMAScript 2 BOM 3 DOM 最开始,网页是由HTML这种静态的标签语言组成的,后来为了丰富网页,引入了Script脚本语言. 但由于浏览器厂商太多,每个厂商都使用自己的语言,导致script的语言种类繁多,最终由Netscape和sun对S

JavaScript必知必会(九)function 说起 闭包问题_javascript技巧

function 函数格式 function getPrototyNames(o,/*optional*/ a) { a = a || []; for(var p in o) { a.push(p); } return a; } caller func.caller 返回函数调用者 function callfunc() { if(callfunc.caller) { alert(callfunc.caller.toString()); }else { alert("没有函数调用");

Python 程序员必知必会的开发者工具

Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作.同样的理念也适用于工具开发者的工作,即便他们开发出的工具并没有出现在最终的程序中.本文将介绍Python程序员必知必会的开发者工具. 对于开发者来说,最实用的帮助莫过于帮助他们编写代码文档了.pydoc模块可以根据源代码中的docstrings为任何可导入模块生成格式良好的文档.Python包含了两个测试框架来自动测试代码以及验证代码的正确性:1)doctest模块,该模块可

《Oracle PL/SQL必知必会》——第2章 初识Oracle和PL/SQL 2.1 什么是Oracle

第2章 初识Oracle和PL/SQL Oracle PL/SQL必知必会 在本章中,你将认识Oracle和PL/SQL是什么,以及你可以使用什么工具来操作它们. 2.1 什么是Oracle 在前一章中,你学习了数据库和SQL.如所解释的那样,做所有工作(存储.检索.管理和操作数据)的实际上是数据库软件(DBMS或数据库管理系统[Database Management System]).Oracle DBMS(或者简称为Oracle)就是一个DBMS:也就是说,它是数据库软件. Oracle已经

Visual Studio 使用及调试必知必会

原文:Visual Studio 使用及调试必知必会   一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2:打开所在的文件夹 右键单击任何一个文件选项卡, 选择"打开所在的文件夹",或在 Solution Explorer 的文件上面点右键: 3:比对同一个文件 鼠标向下拖动红框内的图标. 4:按意愿编程 我把它定义为:按意愿编程,即,在写代码过程中,如果觉得需要使用到一个新类,可以先不用创建这

《Oracle PL/SQL必知必会》导读

前言 Oracle PL/SQL必知必会 Oracle Database(或Oracle RDBMS)是如此流行并且获得了广泛的认可,以至于大多数用户将其简称为"Oracle"(忽略了Oracle公司制作其他软件甚至硬件的事实).Oracle Database(我将像大多数人那样将其简称为"Oracle",以使事情变得简单)从20世纪70年代起就出现了,成为最早的数据库管理系统之一.Oracle是世界上最常用的数据库管理系统(Database Management

【web必知必会】——图解HTTP(上)

原文:[web必知必会]--图解HTTP(上) 本篇总结关于http的相关知识,主要内容参考如下导图: 主要讲解的内容有: 1 URL与URI的区别. 2 请求报文与相应报文的内容. 3 GET与POST的区别. 4 http的cookie.持久化.管道化.多部分对象集合.范围请求等 后续会更新http其他的相关知识. 关键词概念 平时会经常接触到URL,他就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢? 先看看官方的解释: URL:uniform resource l

Android必知必会-使用Intent打开第三方应用及验证可用性

本文讲的是Android必知必会-使用Intent打开第三方应用及验证可用性,一个普通的应用默认会有一个入口 Activity,它在 AndroidManifest.xml 中一般这样写: <application>      <activity android:name=".MainActivity" >          <intent-filter>              <action android:name="andr

MySQL必知必会

本文链接 http://alex-my.xyz/books/database/MySQL必知必会 http://blog.csdn.net/alex_my/article/details/72357498 1 基础知识 1 主键 唯一标识表中每行的这个列(这组列)称为主键. 应该总是定义主键,虽然并不总是需要主键. 任意两行都不具有相同的主键值. 每一行都必须具有一个主键值,不可为NULL. 2 常用命令 SHOW DATABASES; SHOW TABLES; SHOW COLUMNS FRO