C++程序设计:原理与实践(进阶篇)15.2 STL理念

15.2 STL理念


C++标准库为处理数据序列提供了一个专门的框架,称为STL。STL是标准模板库(Standard Template Library)的简称。STL是ISO C++标准库的部分,它提供了容器(例如vector、list和map)和通用算法(例如sort、f?ind和accumulate)。因此我们可以称vector这类对象为STL或标准库的一部分。标准库的其他部分,例如ostream(第10章)和C风格的字符串处理函数(附录C.10.3),并不属于STL。为了更好地理解STL,我们首先考虑在处理数据时必须要解决的问题和对求解方案的理念。

计算过程包含两个主要方面:计算和数据。有时我们只关注计算方面,谈论if语句、循环、函数和错误处理等。有时我们关注的是数据,谈论数组、向量、字符串和文件等。然而,要完成真正的工作我们需要同时考虑计算和数据。如果对大量数据不进行分析、可视化和查找“感兴趣的部分”,则数据是无法理解的。相反,我们可以随心所欲地进行计算,但是只有与实际数据关联之后,才能避免枯燥乏味的无意义计算。而且,“计算部分”要优雅地与“数据部分”进行交互。

 

当谈起数据时,我们会想到很多类型的数据:数十个形状、数百个温度值、数千个日志记录、数百万个点、数十亿个网页等,即我们在讨论数据的容器、数据流等。特别地,我们并不是要讨论如何为一个小对象(例如,一个复数、一个温度读数或一个圆形等)选择最恰当的数值。对于这些类型,可以参看第9、11和19章。

考虑我们需要对“大量数据”进行的一些简单操作:

按照字典序排序。

根据姓名在电话本中找到对应的电话号码。

找出温度的最高值。

找出所有大于8800的值。

找出第一个值为17的元素。

根据单元编号对遥测记录进行排序。

根据时间戳对遥测记录进行排序。

找出第一个值大于“Petersen”的元素。

找出最大值。

找出两个序列的第一个不同之处。

计算两个序列中对位元素两两之积。

找出一个月中每天的最高气温。

在销售记录中找出最畅销的10件商品。

统计“Stroustrup”在网页中出现的次数。

计算各个元素之和。

注意,我们在讨论上述数据处理任务时,并没有提到数据如何存储。很显然,我们必须使用链表、向量、文件和输入流等来完成这些任务,但是我们不必了解这些数据存储(或收集)的细节,即可讨论如何对它们进行处理。重要的是这些值或对象的类型(元素类型),我们如何访问这些值或对象,以及要对它们进行什么操作。

这些任务非常常见,我们自然希望能编写代码简单高效地完成这些任务。与之相对,我们需要考虑的问题是:

数据类型(“数据种类”)变化万千。

数据集存储方法多到让人眼花缭乱。

我们想对数据集执行的任务也数量繁多。

为了尽可能降低这些问题的影响,我们希望编写的代码能够处理各种数据类型,处理各种数据存储方法,适用于各种处理任务。换句话说,我们想通过泛化代码来适应各种变化。我们要避免对每一个问题都从头开始寻找处理方法,那样会浪费大量的时间。

为了编写能够达到上述目的的代码,首先用更加抽象的方式来看待我们要对数据进行的处理工作:

收集数据并装入容器。

例如vector、list和数组。

组织数据。

用于打印;

用于快速访问。

提取数据。

通过索引(例如,第42个元素);

通过值(例如,年龄字段是7的第一条记录);

根据属性(例如,所有温度字段大于32小于100的记录)。

修改容器。

增加数据;

减少数据;

排序(根据某种标准)。

进行简单的数值运算(例如,将每一个元素乘以1.7)。

我们在完成上述任务时要避免陷入各种细节之中:各种容器间的差别、各种数据元素访问方法间的差别以及各种数据类型间的差别。如果我们能够做到这一点,就等于向编写简单高效的通用代码的目标迈出了一大步。

回顾前面几章介绍的编程工具和技术,我们(已经)可以编写功能相似但与数据类型无关的代码:

使用int与使用double基本没有差异。

使用vector<int>与使用vector<string>基本没有差异。

使用double类型的数组与使用vector<double>基本没有差异。

我们希望通过合理组织代码,实现只有当我们想要完成一些全新的任务时才需要编写新的代码。特别是,我们希望编写一些完成基本任务的代码,使得我们不必每次发现一种新的数据存储方式或数据解释方式时都重写整个程序。

在vector中查找一个值与在数组中查找一个值差异不大。

查找string时不区分大小写与区分大小写的差异不大。

绘制实验数据图时使用准确值与使用四舍五入值的差异不大。

拷贝文件与拷贝vector对象的差异不大。

根据上面的发现,我们希望编写的代码具有以下特点:

容易阅读。

容易修改。

规范。

简短。

快速。

为了简化编程工作,我们会:

使用统一的方式访问数据。

与数据存储方法无关;

与数据类型无关。

使用类型安全的方式访问数据。

便于遍历数据。

紧凑存储数据。

快速

读取数据;

增加数据;

删除数据。

对通用算法提供标准实现。

例如拷贝、查找、搜索、排序、求和等。

STL提供了上述功能以及更多。我们不应仅仅将它看作一个强大的功能库,更应看作一个兼顾灵活性与性能的函数库设计的典范。STL由Alex Stepanov设计,提供了一个作用于数据结构之上的通用、正确和高效的算法框架。其设计理念满足简单性、通用性和数学上的优雅。

除了使用设计理念和原则清晰的框架来处理数据之外,另一种策略是让程序员使用最基本的语言特性从头开始编写每个程序,并采用一些当时看起来不错的思想。这种方式费时费力,而且得到的程序代码往往非常糟糕,毫无章法可言,除作者之外的人很难理解,而且在其他场合能够复用的可能性微乎其微。

在介绍完STL的设计初衷和理念之后,我们会给出STL的一些基本定义,最后通过例子展示如何在实际应用中运用这些基本理念:编写更好的处理数据的代码,而且让编写过程更简单。

时间: 2024-10-31 22:33:38

C++程序设计:原理与实践(进阶篇)15.2 STL理念的相关文章

c++-关于《C++程序设计原理与实践》第3章例子的一个问题

问题描述 关于<C++程序设计原理与实践>第3章例子的一个问题 本人菜鸟,现正在学习C++.<C++程序设计原理与实践>第3章有一个例子,代码如下: #include #include #include #include #include using namespace std; inline void keep_window_open(){ char ch; cin >> ch; } int main() //C++ Programs start by executi

源代码-C++程序设计原理与实践

问题描述 C++程序设计原理与实践 #include "std_lib_facilities.h" int main() { cout<<"Hello,world!n"; return 0; } 我下了源代码,放到那里才能猜VC98编译时不出错?最好详细点,带有图解 解决方案 ...大哥,都什么年代了还用98

C++程序设计:原理与实践(进阶篇)15.1 存储和处理数据

摘要 Programming: Principles and Practice Using C++, Second Edition 容器和迭代器 只做一件事,并把它做好.多个程序协同工作. --Doug McIlory 本章和下一章将分别介绍C++标准库(STL)中的容器和算法部分.STL是一个用于处理C++程序中数据的可扩展框架.我们首先通过一个简单的例子来说明STL的设计理念和基本概念,然后详细讨论迭代器.链表和STL中的容器.STL通过序列(sequence)和迭代器(iterator)的

《 C++程序设计:原理与实践(进阶篇.》导读

本节书摘来自华章出版社< C++程序设计:原理与实践(进阶篇)>一书中作者[美] 本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著 刘晓光 李忠伟 王刚 译     前 言 Programming: Principles and Practice Using C++, Second Edition 该死的鱼雷!全速前进. --Admiral Farragut 程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式.程序设计中很多工作都花费在寻找求解方案以及对其求精上

100分求java语言程序设计进阶篇pdf

问题描述 求java语言程序设计进阶篇pdf 解决方案 解决方案二:同求啊!!!解决方案三:这个网上是没有的,我也在网上找过,我建议你去网上找java核心技术<上下卷>pdf这本书写的也是不错的,,这个网上有电子书的,,这两本书配合着java编程思想,相当的不错的解决方案四:真正的进阶是需要项目练习的,纸上得来终觉浅解决方案五:引用2楼xinzailiulei的回复: 这个网上是没有的,我也在网上找过,我建议你去网上找java核心技术<上下卷>pdf这本书写的也是不错的,,这个网上

学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

原文 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 感谢大家在上一篇 学一点Git--20分钟git快速上手 里的踊跃发言.这里再次分享干货, 简单介绍mysql双机,多机异地热备简单原理实战. 双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一 致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换到另一个. 2. 可以做负载均衡,可以将请求分摊到其中任何一台上

推荐系统——从原理到实践,还有福利赠送!

之前流水账似的介绍过一篇机器学习入门的文章,大致介绍了如何学习以及机器学习的入门方法并提供了一些博主自己整理的比较有用的资源.这篇就尽量以白话解释并介绍机器学习在推荐系统中的实践以及遇到的问题... 也许很多点在行家的眼里都是小菜一碟,但是对于刚刚接触机器学习来说,还有很多未知等待挑战. 所以读者可以把本篇当做是机器学习的玩具即可,如果文中有任何问题,还请不吝指教. 本篇将会以下面的步骤描述机器学习是如何在实践中应用的: 1 什么是推荐系统? 2 机器学习的作用 3 机器学习是如何使用的? 4

Node.js Stream - 进阶篇

上篇(基础篇)主要介绍了Stream的基本概念和用法,本篇将深入剖析背后工作原理,重点是如何实现流式数据处理和 back pressure 机制. 目录 本篇介绍 stream 是如何实现流式数据处理的. 数据生产和消耗的媒介 为什么使用流取数据 下面是一个读取文件内容的例子: const fs = require('fs') fs.readFile(file, function (err, body) { console.log(body) console.log(body.toString(

SQL Server调优系列进阶篇(如何索引调优)

原文:SQL Server调优系列进阶篇(如何索引调优) 前言 上一篇我们分析了数据库中的统计信息的作用,我们已经了解了数据库如何通过统计信息来掌控数据库中各个表的内容分布.不清楚的童鞋可以点击参考. 作为调优系列的文章,数据库的索引肯定是不能少的了,所以本篇我们就开始分析这块内容,关于索引的基础知识就不打算深入分析了,网上一搜一片片的,本篇更侧重的是一些实战项内容展示,希望通过本篇文章各位看官能在真正的场景中找到合适的解决方法足以. 对于索引的使用,我希望的是遇到问题找到合适的解决方法就可以,