欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    CSTL泛型编程.ppt

    • 资源ID:4515298       资源大小:2.77MB        全文页数:142页
    • 资源格式: PPT        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    CSTL泛型编程.ppt

    1,C+STL泛型编程(Generic Programming),2,为什么要采用泛型编程?,项目中,需要用到数组、链表、字符串、栈、队列、平衡二叉树等数据结构,以及排序、搜索等算法;若全部自行编写比较麻烦;ANSI C+中包含了C+STL(Standard Template Library,标准模板库,又称C+泛型库),定义了常用的数据结构和算法,使用十分方便。有了STL,不必再从头写大多的标准数据结构和算法,并且可获得非常高的性能。,但这不意味着我们不需要掌握基本数据结构与算法;相反,只有透彻理解了,才能更好的使用泛型!,泛型程序设计,由Alexander Stepanov和David Musser创立,于1998年被添加进C+标准.含义:编写不依赖于具体数据类型的程序.目标:将程序写得尽可能通用.将算法从特定的数据结构中抽象出来,成为通用的.C+的模板为泛型程序设计奠定了关键的基础.STL(标准模板库,Standard Template Library)是泛型程序设计的一个范例.,代码重用(reuse)!,4,函数模板模板函数的重载类模板堆栈类继承static成员友元,模板,函数模板简介,5,【引例】交换2个整数和交换2个浮点数的C+程序:,/交换2个整数void Swap(int,int main()int a=10,b=20;float c=1.2,d=2.4;cout a=a b=b;cout c=c d=c;Swap(a,b);cout a=a b=b;Swap(c,d);cout c=c d=c;return 0;,两个Swap函数实现的功能相同,只是参数类型不同,但为了实现不同类型的数据交换必须分别编写函数。造成了重复劳动。,函数重载,6,能否提供一种方法将两个函数合并,以节省开发成本?,引例,typedef int DataType;void Swap(DataType,当需要交换两个浮点数时可以将DataType 定义成float 型数据即可。typedef float DateType;,存在问题:更改一种数据类型时,需要修改程序源代码,必须重新编译程序。如果程序中需要交换多种数据类型数据,怎么办?,7,引例,#includeusing namespace std;template void Swap(T,模板声明,定义函数模板,通用的Swap!,模板机制,模板的概念,模板是一种使用无类型参数来产生一系列函数或类的机制。模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。,8,模板分类,函数模板(function template)是独立于类型的函数可产生函数的特定版本类模板(class template)与类相关的模板,如vector可产生类对特定类型的版本,如vector,9,模板工作方式,模板只是说明,需要实例化后才能执行或使用.,10,函数模板(function template),定义格式:template类型名 函数名(参数表)函数体,template void Swap(T,11,template:函数模板定义关键字.中是函数的模板参数,参数可有一个或多个,逗号隔开。不能为空!模板参数常用形式:class 标识符 或者 typename 标识符模板参数表明函数可以接收的类型参数,可以是内部类型,也可以是自定义类型.,【例1】简单函数模板定义和应用.,#include using namespace std;template T Max(T a,T b)return a b?a:b;int main()cout Max(3,5)is Max(3,5)endl;cout Max(y,e)is Max(y,e)endl;cout Max(9.3,0.5)is Max(9.3,0.5)endl;return 0;,函数模板,int Max(int a,int b)return a b?a:b;,由实参类型实例化,char Max(char a,char b)return a b?a:b;,double Max(double a,double b)return a b?a:b;,编译器生成的模板函数,函数模板实例化,运行结果:Max(3,5)is 5Max(y,e)is y Max(9.3,0.5)is 9.3,函数模板的原理分析:函数模板中声明了类型参数T,表示了一种抽象类型.编译器检测到程序调用函数模板Max时,用其第一个实参类型替换掉模板中的T,同时建立一个完整的函数Max,并编译该新建的函数.本例中,针对三种数据类型,生成了三种函数.,【练习1】编写一个对具有n个元素的数组a 求最小值的程序,要求将求最小值的函数设计成函数模板。,#include using namespace std;template T MinArray(T a,int n)int i;T mina=a0;for(i=1;i ai)mina=ai;return mina;,void main()int arr1=1,3,0,2,7,6,4,5,2;double arr2=1.2,-3.4,6.8,9,8;coutarr1数组的最小值为:MinArray(arr1,9)endl;coutarr2数组的最小值为:MinArray(arr2,4)endl;,运行结果:arr1数组的最小值为:0Arr2数组的最小值为:-3.4,注意点1:实参类型与形参类型必须严格匹配.,#include using namespace std;template T Max(T a,T b)return a b?a:b;int main()int a=3;float b=1.5;cout Max(a,b)is Max(a,b)endl;return 0;,错误!模板类型不能提供类型的隐式转换,注意点2:在函数模板中允许使用多个类型参数。在template定义部分的每个模板形参前必须有关键字class或typename.,#includeusing namespace std;templatevoid myfunc(T1 x,T2 y)coutx,yendl;,运行结果:100,hao3.14,10,void main()myfunc(100,hao);myfunc(3.14,10L);,注意点3:在template语句与函数模板定义语句之间不允许有别的语句。Template int i;T Max(T x,T y)return(xy)?x:y;,8,/错误,不允许有别的语句,模板优缺点,优点:函数模板方法克服了C语言用大量不同函数名表示相似功能的弊端;克服了宏定义不能进行参数类型检查的弊端;克服了C+函数重载用相同函数名字重写几个函数的繁琐.缺点:调试比较困难.一般先写一个特殊版本的函数运行正确后,改成模板函数,17,18,【练习2】编写一个函数模板,它返回两个值中的较小者,同时要求能正确处理字符串。分析:由于C+字符串比较的方法与字符型、数值型都不同,因此函数模板不适用于字符串比较;这里设计一个函数模板template T min(T a,T b),可以处理int、float和char 等数据类型;为了能正确处理字符串,添加一个重载函数专门处理字符串比较,即char*min(char*a,char*b)。,#include#include template T min(T a,T b)return(ab?a:b);char*min(char*a,char*b)return(strcmp(a,b)0?a:b);void main()double a=3.14,b=8.28;char s1=Bad,s2=Good;cout输出结果:endl;coutmin(a,b)endl;coutmin(s1,s2)endl;,函数模板,函数重载,运行结果:3.14Bad,20,可以显式指定(explicitly specify),如:i=max(ia,5);d=max(da,6);,用函数模板求数组元素中最大值template Groap max(const Groap*r_array,int size)int i;Groap max_val=r_array0;for(i=1;i max_val)max_val=r_arrayi;return max_val;,可读性更好。,21,函数模板可以重载,形参表不同即可 例,下面两个模板可以同时存在:template void print(T1 arg1,T2 arg2)cout void print(T arg1,T arg2)cout arg1 arg2endl;,重载,22,例:函数模板调用顺序,23,double Max(double a,double b)cout MyMax endl;return 0;,template T Max(T a,T b)cout Template Max 1 endl;return 0;,template T Max(T a,T2 b)cout Template Max 2 endl;return 0;,24,void main()int i=4,j=5;Max(1.2,3.4);Max(i,j);Max(1.2,3);,25,匹配顺序C+编译器遵循以下优先顺序:Step 1:先找参数完全匹配的普通函数(非由模板实例化而得的函数)Step 2:再找参数完全匹配的模板函数 Step 3:再找实参经过自动类型转换后能够匹配的普通函数 Step 4:上面的都找不到,则报错,26,void main()int i=4,j=5;Max(1.2,3.4);Max(i,j);Max(1.2,3);,/调用Max(double,double)函数,/调用第一个T Max(T a,T b)模板生成的函数,/调用第二个T Max(T a,T2 b)模板生成的函数,运行结果:MyMax Template Max 1 Template Max 2,27,可以在函数模板中使用多个类型参数,可以避免二义性 template T1 myFunction(T1 arg1,T2 arg2)coutarg1“”arg2“n”;return arg1;myFunction(5,7);myFunction(5.8,8.4);myFunction(5,8.4);,/ok:replace T1 and T2 with int,/ok:replace T1 and T2 with double,/ok:replace T1 with int,T2 with double,28,类模板的定义,C+的类模板的写法如下:template class 类模板名 成员函数和成员变量;类型参数表的写法就是:class 类型参数1,class 类型参数2,29,类模板里的成员函数,如在类模板外面定义时,template 返回值类型 类模板名:成员函数名(参数表),类模板的定义,30,用类模板定义对象的写法如下:类模板名 对象名(构造函数实际参数表);如果类模板有无参构造函数,那么也可以只写:类模板名 对象名;,类模板的定义,31,Pair类模板:template class Pair public:T1 key;/关键字 T2 value;/值 Pair(T1 k,T2 v):key(k),value(v);bool operator,类模板的定义,32,#include#includeusing namespace std;。void main()Pair stu(Tom,19);Pair stu2(Jack,20);if(stu.operator(stu2)cout stu.key stu.value;else cout stu.key stu2.value;,运行结果:Jack 20,Pair类模板的使用:,33,使用类模板声明对象 编译器由类模板生成类的过程叫类模板的实例化 编译器自动用具体的数据类型替换类模板中的类型参数,生成模板类的代码 由类模板实例化得到的类叫模板类 为类型参数指定的数据类型不同,得到的模板类不同,同一个类模板的两个模板类是不兼容的 Pair*p;Pair a;p=/wrong,34,#include using namespace std;template class A public:template void Func(T2 t)cout a;a.Func(K);,若函数模板改为 template void Func(T t)coutt 将报错“declaration of class T shadows template parm class T”,程序输出:K,/成员函数模板,/成员函数模板 Func被实例化,函数模版作为类模板成员,35,template class Apublic:templatevoid Func(T2 t);templatetemplatevoid A:Func(T2 t)cout t;,void main()A a;a.Func(K);,36,类模板的参数声明中可以包括非类型参数 template 非类型参数:用来说明类模板中的属性 类型参数:用来说明类模板中的属性类型,成员操作的参数类型和返回值类型,类模板与非类型参数,37,template class CArray T arraysize;public:void Print()for(int i=0;i size;+i)cout array i endl;,类模板与非类型参数,CArray a2;CArray a3;,38,CArray a2;CArray a3;注意:CArray和CArray完全是两个类 这两个类的对象之间不能互相赋值,类模板与非类型参数,39,类模板派生出类模板 模板类(即类模板中类型/非类型参数实例化后的类)派生出类模板 普通类派生出类模板 模板类派生出普通类,类模板与继承,派生,类模板,类模板,模板类,类模板,类模板,类模板,普通类,模板类,40,类模板从类模板派生,(1)template class A T1 v1;T2 v2;template class B:public A T1 v3;T2 v4;,template class C:public B T v5;,void main()B obj1;C obj2;,41,void main()B obj1;C obj2;,class B:public A int v3;double v4;class A double v1;int v2;,42,类模板从模板类派生,template class A T1 v1;T2 v2;template class B:public A T v;int main()B obj1;return 0;自动生成两个模板类:?,43,template class A T1 v1;T2 v2;template class B:public A T v;int main()B obj1;return 0;自动生成两个模板类:A和B,(2)类模板从模板类派生,44,class A int v1;template class B:public A T v;int main()B obj1;return 0;,(3)类模板从普通类派生,45,(4)普通类从模板类派生,template class A T v1;int n;class B:public A double v;int main()B obj1;return 0;,46,C+支持两种编译模式包含模式(Inclusion Model)把所有的定义一起放在头文件中,在调用的CPP中,包含相关的头文件分离模式(Separation Model)(好像VC编译器不支持)/model.h template Type tMin(Type t1,Type t2);/model.cpp export template Type tMin(Type t1,Type t2);/test.cpp#include“model.h”int i,j;double d=min(i,j);,模板编译模式,47,1.矩阵运算:矩阵转置与矩阵相乘函数模板。下标作为参数传递。,2.线性表是数据结构中的概念。数组中除第一个元素外,其他元素有且仅有一个直接前驱,第一个元素没有前驱;除最后一个元素外,其他元素有且仅有一个直接后继,最后一个元素无后继。这样的特性称为线性关系。所以称数组元素在一个线性表中。线性表实际包括顺序表(数组)和链表。,对顺序表的典型操作包括:计算表长度,寻找变量或对象x(其类型与表元素相同)在表中的位置(下标值),判断x是否在表中,删除x,将x插入列表中第i个位置,寻找x的后继,寻找x的前驱,判断表是否空,判断表是否满(表满不能再插入数据,否则会溢出,产生不可预知的错误),取第i个元素的值。,作业,48,堆栈类及其模板实现,class CStackpublic:CStack(int capcity=20);CStack();void ClearStack();bool isEmpty();bool isFull();int StackLength();char GetTop();void Push(char e);void Pop();private:char*elemArray;int top;int capcity;,49,类模板与友员函数,函数、类、类的成员函数作为类模板的友元函数模板作为类模板的友元函数模板作为类的友元类模板作为类模板的友元,50,函数、类、类的成员函数作为类模板的友元,void Func1()class A;class Bpublic:void Func();,template class Tmpl friend void Func1();friend class A;friend void B:Func();,51,函数、类、类的成员函数作为类模板的友元,int main()Tmpl i;Tmpl f;return 0;,52,函数模板作为类模板的友元,#include#include using namespace std;template class Pairprivate:T1 key;/关键字 T2 value;/值public:Pair(T1 k,T2 v):key(k),value(v);bool operator,53,函数模板作为类模板的友元,templatebool Pair:operator,54,函数模板作为类模板的友元,int main()Pair student(Tom,29);Pair obj(12,3.14);cout ostream&operator&p)生成的函数,都被判断为Pair摸板类的友元,输出结果:(Tom,29)12,3.14),55,函数模板作为类的友元,#include using namespace std;class A int v;public:A(int n):v(n)template friend void Print(const T,template void Print(const T,56,函数模板作为类的友元,int main()A a(4);Print(a);return 0;,从 template void Print(const T&p)生成的函数,都成为 A 的友元,输出结果:4,void Print(int a)couta;?,57,类模板作为类模板的友元,#include using namespace std;template class Apublic:void Func(const T,template class Bprivate:T v;public:B(T n):v(n)template friend class A;/把类模板A声明为友元;,58,int main()B b(5);A a;a.Func(b);return 0;A 类,成了B类的友元。从A模版实例化出来的类,都是B实例化出来的类的友元,类模板作为类模板的友元,/用B替换A模板中的T,输出结果:5,59,类模板与static成员,#include using namespace std;template class A private:static int count;public:A()+count;A()-count;A(const A,60,类模板与static成员,template int A:count=0;template int A:count=0;int main()A ia,ib;A da;ia.PrintCount();ib.PrintCount();da.PrintCount();return 0;,输出结果:221,C+STL,一、STL概述,STL是一个具有工业强度的,高效的C+程序库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法STL主要包含了容器、算法、迭代器库(library)是一系列程序组件的集合,它们可以在不同的程序中重复使用。,63,【引例】阅读以下程序:,#include#include using namespace std;void main()vector v;int i;for(i=0;i:iterator it=v.begin();it!=v.end();it+)cout*it,;coutendl;,Vector容器,声明一个整型Vector容器,尾部元素追加,用迭代器配合循环访问向量元素,64,STL中的基本概念,容器:可容纳各种数据类型的数据结构迭代器:可访问容器中元素的特殊指针算法:用来操作容器中元素的函数模板函数对象:是一个行为类似函数的对象,可象函数一样调用。例如,向量Vector就是容器,iterator是迭代器。STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,最基本的,遍历结构,对数据结构的操作,C+STL是通用数据结构和算法的封装!,C+STL中,容器(container)就是通用的数据结构。容器用来承载不同类型的数据对象;C+中的容器还存在一定的“数据加工能力”它如同一个对数据对象进行加工的模具,可以把不同类型的数据放到这个模具中进行加工处理,形成具有一定共同特性的数据结构。例如,将int型、char型或者float型放到队列容器中,就分别生成int队列、char型队列或者float型队列.它们都是队列,具有队列的基本特性,但是具体数据类型是不一样的。,概念 之 容器,就如同现实生活中,人们使用容器用来装载各种物品一样,66,概念 之 容器适配器,C+STL容器适配器用来扩充7种基本容器:stack:栈(LIFO)queue:队列(FIFO)priority_queue:优先级队列,67,概念 之 迭代器,用于指向容器中的元素。通过迭代器可以读取它指向的元素。迭代器是泛化的指针,可用“+”改变其指向位置,可用“*”访问内容。,68,68,概念 之 算法,C+STL包含70多个算法。包括:查找、排序、比较、变换、置换、容器管理等。算法是通用的,可作用于不同的类对象和预定义类型数据。,69,69,STL组件间的关系,C+STL将迭代器和函数对象作为算法的参数,提供了极大灵活性。使用 STL提供的或自定义的迭代器,配合STL算法,可组合出各种各样强大的功能。,STL头文件一览,容器的基本功能与分类,容器是容纳、包含一组元素或元素集合的对象。七种基本容器:向量(vector)双端队列(deque)列表(list)集合(set)多重集合(multiset)映射(map)多重映射(multimap)C+STL的容器各有不尽相同的功能和用法。,71,二、顺序容器,顺序容器(sequence container)简介,顺序容器(也称“序列式容器”)将一组具有相同类型的元素以严格的线性形式组织起来。三类顺序容器:(1)vector 头文件 实际上是动态数组。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能。(2)deque 头文件 也是动态数组,随机存取任何元素都能在常数时间完成(但性能次于vector)。在两端增删元素具有较佳的性能。(3)list 头文件 双向链表,在任何位置增删元素都能在常数时间完成。不支持随机存取。,73,关联容器简介,关联容器内的元素是排序的,插入任何元素,都按相应的排序准则来确定其位置。特点是在查找时具有非常好的性能。通常以平衡二叉树方式实现,插入和检索的时间都是 O(logN)四种关联容器:(1)set/multiset:头文件 set 即集合。set中不允许相同元素,multiset中允许存在相同的元素。(2)map/multimap:头文件 map与set的不同在于map中存放的是成对的key/value。并根据key对元素进行排序,可快速地根据key来检索元素 map同multimap的不同在于是否允许多个元素有相同的key值。,类似于Hash表,74,容器适配器简介,(1)stack:头文件 栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则(2)queue:头文件 队列。插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。(3)priority_queue:头文件 优先队列。最高优先级元素总是第一个出列。,容器适配器是一种接口类,为已有类提供新的接口三种容器适配器:,75,容器的共有成员函数,提供容器的通用功能;所有容器共有的成员函数:关系运算:=,=,=,!=empty():判断容器中是否为空max_size():容器中最多能装多少元素size():容器中元素个数s1.swap(s2):交换两个容器的内容 构造函数、拷贝构造函数、析构函数,76,容器的共有成员函数(续),所有顺序容器和关联容器 共有的成员函数:begin():返回指向容器中第一个元素的迭代器 end():返回指向容器中最后一个元素后面的位置的迭代器 rbegin():返回指向容器中最后一个元素的迭代器 rend():返回指向容器中第一个元素前面的位置的迭代器 erase():从容器中删除一个或几个元素 clear():清空容器,77,所有容器都具有的成员函数,顺序和关联容器共同支持的成员函数,【例1】创建两个整型向量容器,分别从尾端增加一些值,输出两个容器的元素数、两个容器的比较结果,交换两个容器后再输出一次。,80,#include#include using namespace std;int main()vector v1,v2;v1.push_back(5);v1.push_back(1);v2.push_back(1);v2.push_back(2);v2.push_back(3);cout v2v2endl;return 0;,声明2个向量,向量赋值,求元素数,向量内容比较,交换2个向量,1、vector向量容器,实际上就是动态数组。但它比数组更灵活,当添加数据时,vector的大小能够自动增加以容纳新的元素。内存自动管理。可动态调整所占内存。支持随机访问,随机访问时间为常数。所有STL算法都能对vector操作。在尾部添加速度很快,在中间插入慢。,81,(1)创建vector对象,四种方式:不指定容器的元素个数:vector 对象名;例如:vector v;/创建整型向量v指定容器大小:vector 对象名(n);例如:vector v(10);/创建整型向量v,10个元素注意:元素下标09,初始化为0.指定容器大小和元素初始值:vector 对象名(n,初值);例如:vector v(10,1);/创建整型向量v,10个元素,每个元素值均为1由已有向量容器创建:vector 对象名(已有对象名);例如:vector v2(v1);/创建整型向量v1的副本v2,82,拷贝构造函数,创建vector向量,#include#include using namespace std;int main()vector v(10,1);for(vector:iterator it=v.begin();it!=v.end();it+)cout*it,;coutendl;return 0;,【例2】创建一个整型向量容器,输出全部元素值。,84,(2)下标方式访问vector元素,可用“”运算符访问vector的元素;,【例3】用“”运算符为整型向量容器元素赋值,输出全部元素值。,#include#include using namespace std;int main()vector v(3);v0=10;v1=100;v2=-20;for(int i=0;i3;i+)coutvi,;coutendl;return 0;,85,vector(向量)下标访问元素,注意:下标操作仅能对确知已存的元素进行赋值和读取操作,vector ivec;/empty vectorfor(int ix=0;ix 100;+ix)ivecix=ix;/ivec has no element,出错,向量中尚没有元素,不能访问!,(3)用迭代器访问vector元素,如何使相同的算法能用于不同的数据结构?-迭代器(算法与容器的”中间人”),87,容器类迭代器定义方法:容器类名:iterator 变量名;访问一个迭代器指向的元素:*迭代器变量名迭代器上可执行”+”,指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值。使用一个past-the-end值的迭代器来访问对象是非法的,定义迭代器的关键字,88,对照理解,vector:iterator xHere=x.Begin();vector:iterator xEnd=x.End();for(;xHere!=xEnd;xHere+)func_name(*xHere);,for(int i=0;i x.Size();i+)func_name(x.Get(i);,【例4】#include#include using namespace std;int main()vector v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector:const_iterator it1;/常量迭代器 for(it1=v.begin();it1!=v.end();it1+)cout:reverse_iterator it2;/反向迭代器 for(it2=v.rbegin();it2!=v.rend();it2+)cout*it2,;cout endl;,89,vector:iterator it3;/非常量迭代器for(it3=v.begin();it3!=v.end();it3+)*it3=100;/重置向量for(it3=v.begin();it3!=v.end();it3+)cout*it3,;cout endl;return 0;,(1)const_iterator:常量迭代器。可以使用这种类型的迭代器来指向一个只读的值。(2)reverse_iterator:反向迭代器。用来反转遍历vector的各元素,注意用rbegin()来代替begin(),用rend()代替end(),而此时的“+”操作符会朝向后的方向遍历。(3)iterator:随机迭代器,可任意方向或移动任意个位置访问。,vector的迭代器,有const限制的只可读取元素值,不可修改元素值,90,不同的容器,STL提供的迭代器功能各不相同。vector容器的迭代器:可使用“+=”、“-”、“+”、“-=”中的任何一种操作符 可使用“”、“=”、“=”、“!=”等比较运算符 可随机访问容器中的数据元素。,vector的迭代器,91,(4)元素插入,push_back在尾部追加元素;insert方法可在vector任意位置插入元素.,【例5】向整型向量容器追加元素,输出全部元素值。,#include#include using namespace std;int main()vector v(10,1);v.push_back(100);v.psuh_back(-200);for(vector:iterator it=v.begin();it!=v.end();it+)cout*it,;coutendl;return 0;,尾部追加元素,vector容器自动分配内存;可对空的vector追加,也可对已有元素的vector追加.,尾部元素追加,92,vector(向量)-添加,在尾端增删元素具有较佳的性能,93,指定位置插入元素,insert(iterator it,T t):对vector容器在指定位置插入新元素,【例6】对整型向量容器插入元素,输出全部元素值。,#include#include using namespace std;int main()vector v(3);vector:iterator it;v0=10;v1=100;v2=-20;v.insert(v.begin(),50);/在最前面插入新元素50 v.insert(v.begin()+2,8);/在第2个元素之前插入新元素8 v.insert(v.end(),9);/在末尾插入新元素9 for(it=v.begin();it!=v.end();it+)cout*it,;coutendl;return 0;,注意:insert方法要求插入的位置,是迭代器位置,而不是下标!,94,通过迭代器随机访问元素,(5)元素删除,pop_back删除向量最后一个元素;erase删除指定位置或一段区间的元素;clear方法删除所有元素.,【例7】向量容器删除元素方法示例。,#include#include using namespace std;int main()vector v(10);vector:iterator it;for(int i=0;i10;i+)vi=i;v.erase(v.begin()+3);/删除第3个元素,从0开始计数 for(it=v.begin();it!=v.end();it+)cout*it,;coutendl;v.erase(v.begin()+1,v.begin()+3);/删除第13个元素 for(it=v.begin();it!=v.end();it+)cout*it,;coutendl向量V中元素数:v.size()endl;v.clear();/清空向量 coutendl向量V中元素数:v.size()endl;return 0;,区间删除,95,(6)向量大小的有关操作,96,向量的大小,size()和 resize(),vector vec(10,42);/10 int,each has value 42cout vec.size()endl;vec.resize(15);/adds 5 elements of value 0 to the back of the vectorcout vec.size()endl;vec.resize(25,-1);/adds 10 elements of value-1 to the back of the vectorcout vec.size()endl;,新增元素初始化为-1,97,size(),max_size()和capacity(),vector v1;cout v2(100,-1);coutv2.size()v2.max_size()v2.capacity()endl;,size(

    注意事项

    本文(CSTL泛型编程.ppt)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开