C标准模板库本部分以自学为主教学讲义_第1页
C标准模板库本部分以自学为主教学讲义_第2页
C标准模板库本部分以自学为主教学讲义_第3页
C标准模板库本部分以自学为主教学讲义_第4页
C标准模板库本部分以自学为主教学讲义_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

C标准模板库本部分以自学为主教学讲义2主要内容泛型程序设计与标准模板库有关的概念和术语C++标准模板库中的容器迭代器标准C++库中的算法函数对象3泛型程序设计将程序写得尽可能通用,即:将算法从特定的数据结构中抽象出来,成为通用的(可针对各种数据类型)C++的模板为泛型程序设计奠定了关键的基础STL是泛型程序设计的一个范例容器(container)迭代器(iterator)算法(algorithms)函数对象(functionobject)四个最关键的组件4本章重点群体数据的类型多且处理复杂。不过,不是所有的程序员都要从头开始自行设计所需要的类型及算法。StandardTemplateLibrary是已有的经典优秀的模板,本章的重点是如何使用现有的STL。重点理解本章例10-1至例10-15的所有例题,请自行学习,不明白的,要求查找MSDN(考试重点):

Reference\C/C++LanguageandC++Libraries\StandardC++LibraryReference

或上网查找。

试卷中本章内容均是本章的例题及布置的练习(两道大题),5命名空间(Namespace)的引入在缺省情况下,在全局域中声明的每个对象、函数、类型或模板都引入了一个全局实体(globalentity).在全局名字空间域引入的全局实体必须有唯一的名字。例如:函数和对象不能有相同的名字,无论它们是否在同一程序文本文件中被声明。如果程序中使用一个库,必须保证程序中的全局实体的名字不能与库中的全局实体名字冲突。如果程序是由许多厂商提供的库构成,则很难保证各种库会将许多名字引入到全局字空间域中。在组合不同厂商的库时,就怎样才能确保程序中的全局实体不会与这些库中声明的全局实体名冲突?名字冲突问题也被称为:全局名字空间污染(globalnamespacepollution)程序员可以通过使用全局实体名字很长或在名字前加特殊的字符序列前缀,从而避免这些问题,但这样是个累赘。而名字空间正是解决此类问题而引入的一种机制。6命名空间(Namespace)的引入库的作者可定义一个名字空间,从而库中的所有引入的实体都隐藏在该名字空间之中。如:namespacecplusplus_primer{

classmatrix{……}voidinverse(matrix&){….}}在一个名字空间中声明的实体如:函数,对象、类、类模板和类型声明等都被称为名字空间的成员(namespacemember)。用户声明的名字空间中的每个名字必须是名字空间内的唯一实体。但不同用户声明的名字空间引入了不同的域,所以两个不同的名字空间可以有相同的名字成员。如:namespaceDisneyFeatureAnimation{classmatrix{….}voidinverse(matrix&){….}}在程序中我们可以用既定修饰名来使用名字空间的成员。7命名空间(Namespace)的引入voidfunc(DisneyFeatureAnimation::Matrix&m){DisneyFeatrueAnimation::inverse(m);}voidmain(){cplusplus::Matrixm1;…..}如果:usingnamespaceDisneyFeatureAnimationvoidmain(){Matrixm1;cplusplus::Matrixm2;……..}8命名空间(Namespace)一个命名空间将不同的标识符集合在一个命名作用域(namedscope)内为了解决命名冲突例如,声明一个命名空间NS:namspaceNS{classFile;voidFun();......}

则引用标识符的方式如下,NS::Fileobj;NS::Fun();没有声明命名空间的标识符都处于无名的命名空间中9可以用using来指定命名空间例如,经过以下声明:

usingNS::File;//或usingNS;

//在当前作用域中就可以直接引用Fileusingnamespacestd;

命名空间std中所有标识符都可直接引用在新的C++标准程序库中,所有标识符都声明在命名空间std中,头文件都不使用扩展名命名空间(Namespace)有关命名空间(Namespace)

详见《C++Primer》10容器容器类是容纳、包含一组元素或元素集合的对象。异类容器类与同类容器类顺序容器与关联容器七种基本容器:向量(vector)双端队列(deque)列表(list)集合(set)多重集合(multiset)映射(map)多重映射(multimap)11容器的接口通用容器运算符==,!=,>,>=,<,<=,=方法(函数)迭代方法begin(),end(),rbegin(),rend()访问方法size(),max_size(),swap(),empty()12适配器适配器是一种接口类为已有的类提供新的接口。目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合。三种类型的适配器:容器适配器用来扩展7种基本容器,它们和顺序容器相结合构成栈、队列和优先队列容器迭代器适配器函数对象适配器。13迭代器迭代器是面向对象版本的指针,它们提供了访问容器、序列中每个元素的方法。14算法C++标准模板库中包括70多个算法其中包括查找算法,排序算法,消除算法,记数算法,比较算法,变换算法,置换算法和容器管理等等。这些算法的一个最重要的特性就是它们的统一性,并且可以广泛用于不同的对象和内置的数据类型。使用时必须指名模板参数。15顺序容器顺序容器的接口:插入方法

push_front(),push_back(),insert(),“=”删除方法pop(),erase(),clear()迭代访问方法使用迭代器其它顺序容器访问方法(不修改访问方法)front(),back(),下标[]运算符16顺序容器——向量向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)向量是动态结构,它的大小不固定,可以在程序运行时增加或减少。#include<iostream>//10_1.cpp#include<iomanip>#include<vector> usingnamespacestd;voidmain(void){

vector<int>A(10);

intn; intprimecount=0,i,j;cout<<"Enteravalue>=2asupperlimit:";cin>>n;

A[primecount++]=2; 17for(i=3;i<n;i++){if(primecount==A.size())

A.resize(primecount+10);if(i%2==0)continue;j=3;while(j<=i/2&&i%j!=0)j+=2;if(j>i/2)A[primecount++]=i;}for(i=0;i<primecount;i++)//输出质数

{cout<<setw(5)<<A[i];if((i+1)%10==0)cout<<endl;}cout<<endl;}18#include<iostream>#include<vector>usingnamespacestd;voidmain(){ typedefvector<int>IntArray; IntArrayarray; array.push_back(1); array.push_back(2); array.push_back(2); array.push_back(3); array.push_back(2); array.push_back(2); array.push_back(2); array.push_back(5); for(IntArray::iteratoritor=array.begin();itor!=array.end();++itor) cout<<*itor<<""; cout<<endl; for(itor=array.begin();itor!=array.end();++itor) { if(2==*itor)//删除array数组中所有值为2的元素

array.erase(itor); } cout<<endl<<array.size()<<endl; for(itor=array.begin();itor!=array.end();++itor) cout<<*itor<<"";cout<<endl;}19顺序容器——双端队列双端队列是一种放松了访问权限的队列。元素可以从队列的两端入队和出队,也支持通过下标操作符“[]”进行直接访问。重点掌握(要求同前):

P338例10-2

20顺序容器——列表列表主要用于存放双向链表,可以从任意一端开始遍历。列表还提供了拼接(splicing)操作,将一个序列中的元素从插入到另一个序列中。#include<iostream>//10_3.cpp#include<list>usingnamespacestd;voidmain(void){

list<int>Link; //构造一个用于存放整数链表

inti,key,item;

for(i=0;i<10;i++)//输入10个整数依次向表头插入

{

cin>>item;

Link.push_front(item);

}

cout<<"List:";//输出链表21

list<int>::iteratorp=Link.begin();

while(p!=Link.end())//输出各节点数据直到链表尾

{

cout<<*p<<"";

p++;//使P指向下一个节点

}

cout<<endl<<"请输入一个需要删除的整数:";

cin>>key;

Link.remove(key);

cout<<"List:";//输出链表

p=Link.begin(); //使P重新指向表头

while(p!=Link.end())

{

cout<<*p<<"";

p++;//使P指向下一个节点

}}22容器适配器容器适配器是用来扩展7种基本容器的栈容器使用适配器与一种基础容器相结合来实现队列容器使用适配器与一种基础容器相结合来实现的先进先出数据结构。重点掌握(要求同前):

P341例10-4

P342例10-5

23什么是迭代器迭代器是面向对象版本的指针指针可以指向内存中的一个地址迭代器可以指向容器中的一个位置STL的每一个容器类模版中,都定义了一组对应的迭代器类使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。迭代器的类型输入迭代器可以用来从序列中读取数据输出迭代器允许向序列中写入数据前向迭代器既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历双向迭代器与前向迭代器相似,但是在两个方向上都可以对数据遍历随机访问迭代器也是双向迭代器,但能够在序列中的任意两个位置之间进行跳

温馨提示

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

评论

0/150

提交评论