C++标准模板库与操作和异常处理.ppt_第1页
C++标准模板库与操作和异常处理.ppt_第2页
C++标准模板库与操作和异常处理.ppt_第3页
C++标准模板库与操作和异常处理.ppt_第4页
C++标准模板库与操作和异常处理.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十章C 标准模板库 C 语言程序设计 第十一章流类库与输入 输出 第十二章异常处理 2 主要内容 泛型程序设计与标准模板库有关的概念和术语C 标准模板库中的容器迭代器标准C 库中的算法函数对象 3 泛型程序设计 将程序写得尽可能通用将算法从特定的数据结构中抽象出来 成为通用的C 的模板为泛型程序设计奠定了关键的基础STL是泛型程序设计的一个范例容器 container 迭代器 iterator 算法 algorithms 函数对象 functionobject 4 命名空间 Namespace 一个命名空间将不同的标识符集合在一个命名作用域 namedscope 内为了解决命名冲突例如 声明一个命名空间NS namspaceNS classFile voidFun 则引用标识符的方式如下 NS Fileobj NS Fun 没有声明命名空间的标识符都处于无名的命名空间中 概念和术语 5 命名空间 Namespace 可以用using来指定命名空间例如 经过以下声明 usingNS File 在当前作用域中就可以直接引用Fileusingnamespacestd 命名空间std中所有标识符都可直接引用在新的C 标准程序库中 所有标识符都声明在命名空间std中 头文件都不使用扩展名 概念和术语 6 容器 容器类是容纳 包含一组元素或元素集合的对象 异类容器类与同类容器类顺序容器与关联容器七种基本容器 向量 vector 双端队列 deque 列表 list 集合 set 多重集合 multiset 映射 map 和多重映射 multimap 概念和术语 7 容器的接口 通用容器运算符 方法 函数 迭代方法begin end rbegin rend 访问方法size max size swap empty 8 适配器 适配器是一种接口类为已有的类提供新的接口 目的是简化 约束 使之安全 隐藏或者改变被修改类提供的服务集合 三种类型的适配器 容器适配器用来扩展7种基本容器 它们和顺序容器相结合构成栈 队列和优先队列容器迭代器适配器函数对象适配器 概念和术语 9 迭代器 迭代器是面向对象版本的指针 它们提供了访问容器 序列中每个元素的方法 概念和术语 10 算法 C 标准模板库中包括70多个算法其中包括查找算法 排序算法 消除算法 记数算法 比较算法 变换算法 置换算法和容器管理等等 这些算法的一个最重要的特性就是它们的统一性 并且可以广泛用于不同的对象和内置的数据类型 概念和术语 11 顺序容器 顺序容器的接口插入方法push front push back insert 运算符 删除方法pop erase clear 迭代访问方法使用迭代器其它顺序容器访问方法 不修改访问方法 front back 下标 运算符 容器 12 顺序容器 向量 向量属于顺序容器 用于容纳不定长线性序列 即线性群体 提供对序列的快速随机访问 也称直接访问 向量是动态结构 它的大小不固定 可以在程序运行时增加或减少 例10 1求范围2 N中的质数 N在程序运行时由键盘输入 容器 10 1 cpp include include include 包含向量容器头文件usingnamespacestd voidmain void vectorA 10 intn intprimecount 0 i j cout 2asupperlimit cin n A primecount 2 13 for i 3 ii 2 A primecount i for i 0 i primecount i 输出质数 cout setw 5 A i if i 1 10 0 每输出10个数换行一次cout endl cout endl 14 15 顺序容器 双端队列 双端队列是一种放松了访问权限的队列 元素可以从队列的两端入队和出队 也支持通过下标操作符 进行直接访问 例10 2使用双端队列容器保存双精度数值序列 容器 16 顺序容器 列表 列表主要用于存放双向链表 可以从任意一端开始遍历 列表还提供了拼接 splicing 操作 将一个序列中的元素从插入到另一个序列中 例10 3改写例9 7从键盘输入10个整数 用这些整数值作为结点数据 生成一个链表 按顺序输出链表中结点的数值 然后从键盘输入一个待查找整数 在链表中查找该整数 若找到则删除该整数所在的结点 如果出现多次 全部删除 然后输出删除结点以后的链表 在程序结束之前清空链表 容器 10 3 cpp include includeusingnamespacestd voidmain void listLink 构造一个列表用于存放整数链表inti key item for i 0 i item Link push front item cout List 输出链表 17 list iteratorp Link begin while p Link end 输出各节点数据 直到链表尾 cout key Link remove key cout List 输出链表p Link begin 使P重新指向表头while p Link end cout p p 使P指向下一个节点 cout endl 18 19 容器适配器 容器适配器是用来扩展7种基本容器的栈容器使用适配器与一种基础容器相结合来实现例10 4 应用标准库中的deque顺序容器生成一个整数栈stack 队列容器使用适配器与一种基础容器相结合来实现的先进先出数据结构 例10 5 应用标准库中的deque顺序容器生成一个整数标准队列Queue 容器 20 什么是迭代器 迭代器是面向对象版本的指针指针可以指向内存中的一个地址迭代器可以指向容器中的一个位置STL的每一个容器类模版中 都定义了一组对应的迭代器类 使用迭代器 算法函数可以访问容器中指定位置的元素 而无需关心元素的具体类型 迭代器 21 迭代器的类型 输入迭代器可以用来从序列中读取数据输出迭代器允许向序列中写入数据前向迭代器既是输入迭代器又是输出迭代器 并且可以对序列进行单向的遍历双向迭代器与前向迭代器相似 但是在两个方向上都可以对数据遍历随机访问迭代器也是双向迭代器 但能够在序列中的任意两个位置之间进行跳转 迭代器 22 迭代器适配器 迭代器适配器是用来扩展 或调整 迭代器功能的类 它本身也被称为迭代器 只是这种迭代器是通过改变另一个迭代器而得到的逆向迭代器通过重新定义递增运算和递减运算 使其行为正好倒置插入型迭代器将赋值操作转换为插入操作 通过这种迭代器 算法可以执行插入行为而不是覆盖行为例10 6应用逆向迭代器和后插迭代器来操作向量容器中的元素 迭代器 23 迭代器相关的辅助函数 advance 函数将迭代器的位置增加 增加的幅度由参数决定Distance 函数返回迭代器之间的距离函数iter swap 交换两个迭代器所指向的元素值例10 7用三个迭代器辅助函数来操作列表容器中的元素 迭代器 24 标准C 库中的算法 算法本身是一种函数模板不可变序列算法 Non mutatingalgorithms 不直接修改所操作的容器内容的算法可变序列算法 Mutatingalgorithms 可以修改它们所操作的容器的元素 排序相关算法数值算法 算法 25 算法应用举例 例10 9应用不可变序列算法对数据序列进行分析例10 10以可变序列算法对数据序列进行复制 生成 删除 替换 倒序 旋转等可变性操作 例10 11应用排序相关算法对序列进行各项操作例10 12应用数值算法对数据序列进行操作 算法 26 函数对象 一个行为类似函数的对象 它可以不需参数 也可以带有若干参数 其功能是获取一个值 或者改变操作的状态 任何普通的函数和任何重载了调用运算符operator 的类的对象都满足函数对象的特征STL中也定义了一些标准的函数对象 如果以功能划分 可以分为算术运算 关系运算 逻辑运算三大类 为了调用这些标准函数对象 需要包含头文件 第十一章流类库与输入 输出 C 语言程序设计 28 本章主要内容 I O流的概念输出流输入流输入 输出流 29 I O流的概念 当程序与外界环境进行信息交换时 存在着两个对象 一个是程序中的对象 另一个是文件对象 流是一种抽象 它负责在数据的生产者和数据的消费者之间建立联系 并管理数据的流动 程序建立一个流对象 并指定这个流对象与某个文件对象建立连接 程序操作流对象 流对象通过文件系统对所连接的文件对象产生作用 读操作在流数据抽象中被称为 从流中 提取 写操作被称为 向流中 插入 30 输出流 最重要的三个输出流是ostreamofstreamostringstream 31 输出流对象 预先定义的输出流对象 cout标准输出cerr标准错误输出 没有缓冲 发送给它的内容立即被输出 clog类似于cerr 但是有缓冲 缓冲区满时被输出 输出流 32 输出流对象 ofstream类支持磁盘文件输出如果在构造函数中指定一个文件名 当构造这个文件时该文件是自动打开的ofstreammyFile filename iosmode 可以在调用默认构造函数之后使用open成员函数打开文件ofstreammyFile 声明一个静态输出文件流对象myFile open filename iosmode 打开文件 使流对象与文件建立联系ofstream pmyFile newofstream 建立一个动态的输出文件流对象pmyFile open filename iosmode 打开文件 使流对象与文件建立联系 输出流 33 插入运算符 插入 运算符是所有标准C 数据类型预先设计的 用于传送字节到一个输出流对象 输出流 34 控制输出格式 控制输出宽度为了调整输出 可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度 例11 1使用width控制输出宽度 includeusingnamespacestd voidmain doublevalues 1 23 35 36 653 7 4358 24 for inti 0 i 4 i cout width 10 cout values i n 输出流 输出结果 1 2335 36653 74358 24 35 例 使用 填充 includeusingnamespacestd voidmain doublevalues 1 23 35 36 653 7 4358 24 for inti 0 i 4 i cout width 10 cout fill cout values i n 输出流 输出结果 1 23 35 36 653 7 4358 24 36 例11 2使用setw指定宽度 include includeusingnamespacestd voidmain doublevalues 1 23 35 36 653 7 4358 24 char names Zoot Jimmy Al Stan for inti 0 i 4 i cout setw 6 names i setw 10 values i endl 输出流 输出结果 Zoot1 23Jimmy35 36Al653 7Stan4358 24 37 例11 3设置对齐方式 include includeusingnamespacestd voidmain doublevalues 1 23 35 36 653 7 4358 24 char names Zoot Jimmy Al Stan for inti 0 i 4 i cout setiosflags ios left setw 6 names i resetiosflags ios left setw 10 values i endl 输出流 输出结果 Zoot1 23Jimmy35 36Al653 7Stan4358 24 38 例11 4控制输出精度 include includeusingnamespacestd voidmain doublevalues 1 23 35 36 653 7 4358 24 char names Zoot Jimmy Al Stan cout setiosflags ios scientific for inti 0 i 4 i cout setiosflags ios left setw 6 names i resetiosflags ios left setw 10 setprecision 1 values i endl 输出流 输出结果 Zoot1Jimmy4e 001Al7e 002Stan4e 003 39 进制 dec oct和hex操纵符设置输入和输出的缺省进制 输出流 40 输出文件流成员函数 输出流成员函数有三种类型 与操纵符等价的成员函数 执行非格式化写操作的成员函数 其它修改流状态且不同于操纵符或插入运算符的成员函数 输出流 41 输出文件流成员函数 open函数把流与一个特定的磁盘文件关联起来 需要指定打开模式 put函数把一个字符写到输出流中 write函数把内存中的一块内容写到一个输出文件流中seekp和tellp函数操作文件流的内部指针close函数关闭与一个输出文件流关联的磁盘文件错误处理函数在写到一个流时进行错误处理 输出流 42 例11 5向文件输出 includeusingnamespacestd structDate intmo da yr voidmain Datedt 6 10 92 ofstreamtfile date dat ios binary tfile write char 输出流 43 二进制输出文件 以通常方式构造一个流 然后使用setmode成员函数 在文件打开后改变模式 使用ofstream构造函数中的模式参量指定二进制输出模式使用二进制操作符代替setmode成员函数 ofs binary 输出流 44 输入流 重要的输入流类 istream类最适合用于顺序文本模式输入 cin是其派生类istream withassign的对象 ifstream类支持磁盘文件输入 istringstream 45 输入流对象 如果在构造函数中指定一个文件名 在构造该对象时该文件便自动打开 ifstreammyFile filename iosmode 在调用缺省构造函数之后使用open函数来打开文件 ifstreammyFile 建立一个文件流对象myFile open filename iosmode 打开文件 filename 输入流 46 提取运算符 提取运算符 对于所有标准C 数据类型都是预先设计好的 是从一个输入流对象获取字节最容易的方法 ios类中的很多操纵符都可以应用于输入流 但是只有少数几个对输入流对象具有实际影响 其中最重要的是进制操纵符dec oct和hex 输入流 47 输入流成员函数 open函数把该流与一个特定磁盘文件相关联 get函数的功能与提取运算符 很相像 主要的不同点是get函数在读入数据时包括空白字符 第6章介绍过 getline的功能是从输入流中读取多个字符 并且允许指定输入终止字符 读取完成后 从读取的内容中删除终止字符 第6章介绍过 read成员函数从一个文件读字节到一个指定的内存区域 由长度参数确定要读的字节数 如果给出长度参数 当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取 输入流 48 输入流成员函数 seekg函数用来设置输入文件流中读取数据位置的指针 tellg函数返回当前文件读指针的位置 close函数关闭与一个输入文件流关联的磁盘文件 输入流 49 例11 9设置位置指针 include includeusingnamespacestd voidmain charch ifstreamtfile payroll ios binary ios nocreate if tfile tfile seekg 8 while tfile good tfile get ch if ch break cout ch else cout ERROR Cannotopenfile payroll endl tfile close 输入流 50 例11 8文件读二进制记录 include include includeusingnamespacestd voidmain struct doublesalary charname 23 employee ifstreamis payroll ios binary ios nocreate if is is read char 输入流 51 例11 10读文件并显示其中空格的位置 include includeusingnamespacestd voidmain charch ifstreamtfile payroll ios binary ios nocreate if tfile while tfile good streamposhere tfile tellg tfile get ch if ch cout nPosition here isaspace else cout ERROR Cannotopenfile payroll endl tfile close 输入流 第十二章异常处理 C 语言程序设计 53 本章主要内容 异常处理的基本思想C 异常处理的实现异常处理中的构造与析构 54 异常处理的基本思想 55 异常处理的实现机制 抛掷异常的程序段 throw表达式 捕获并处理异常的程序段try复合语句catch 异常类型声明 复合语句catch 异常类型声明 复合语句 56 异常处理的实现机制 若有异常则通过throw操作创建一个异常对象并抛掷 将可能抛出异常的程序段嵌在try块之中 控制通过正常的顺序执行到达try语句 然后执行try块内的保护段 如果在保护段执行期间没有引起异常 那么跟在try块后的catch子句就不执行 程序从try块后跟随的最后一个catch子句后面的语句继续执行下去 catch子句按其在try块后出现的顺序被检查 匹配的catch子句将捕获并处理异常 或继续抛掷异常 如果匹配的处理器未找到 则运行函数terminate将被自动调用 其缺省功能是调用abort终止程序 57 例12 1处理除零异常 includeintDiv intx inty voidmain try cout 5 2 Div 5 2 endl cout 8 0 Div 8 0 endl cout 7 1 Div 7 1 endl catch int cout exceptofdevidingzero n cout thatisok n intDiv intx inty if y 0 throwy re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论