C++STL泛型编程.ppt

上传人:少林足球 文档编号:3797167 上传时间:2019-09-23 格式:PPT 页数:142 大小:2.77MB
返回 下载 相关 举报
C++STL泛型编程.ppt_第1页
第1页 / 共142页
C++STL泛型编程.ppt_第2页
第2页 / 共142页
C++STL泛型编程.ppt_第3页
第3页 / 共142页
C++STL泛型编程.ppt_第4页
第4页 / 共142页
C++STL泛型编程.ppt_第5页
第5页 / 共142页
点击查看更多>>
资源描述

《C++STL泛型编程.ppt》由会员分享,可在线阅读,更多相关《C++STL泛型编程.ppt(142页珍藏版)》请在三一文库上搜索。

1、1,C+STL泛型编程 (Generic Programming),2,为什么要采用泛型编程?,项目中,需要用到数组、链表、字符串、栈、队列、平衡二叉树等数据结构,以及排序、搜索等算法; 若全部自行编写比较麻烦; ANSI C+中包含了C+ STL (Standard Template Library , 标准模板库,又称C+泛型库),定义了常用的数据结构和算法,使用十分方便。 有了STL,不必再从头写大多的标准数据结构和算法,并且可获得非常高的性能。,但这不意味着我们不需要掌握基本数据结构与算法;相反,只有透彻理解了,才能更好的使用泛型!,泛型程序设计,由Alexander Stepanov

2、和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,

3、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 ,当需要交换两个浮点

4、数时可以将DataType 定义成float 型数据即可。 typedef float DateType;,存在问题: 更改一种数据类型时,需要修改程序源代码,必须重新编译程序。 如果程序中需要交换多种数据类型数据, 怎么办?,7,引例,#include using namespace std; template void Swap (T ,模板声明,定义函数模板,通用的Swap!,模板机制,模板的概念,模板是一种使用无类型参数来产生一系列函数或类的机制。 模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。 通过模板可以产生类或函数的集合,使它们操作不同的数据类型

5、,从而避免需要为每一种数据类型产生一个单独的类或函数。,8,模板分类,函数模板(function template) 是独立于类型的函数 可产生函数的特定版本 类模板(class template) 与类相关的模板,如vector 可产生类对特定类型的版本,如vector,9,模板工作方式,模板只是说明,需要实例化后才能执行或使用.,10,函数模板(function template),定义格式: template 类型名 函数名(参数表) 函数体 ,template void Swap (T ,11,template: 函数模板定义关键字. 中是函数的模板参数,参数可有一个或多个,逗号隔开。

6、不能为空! 模板参数常用形式: 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

7、, 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 5 Max(y, e) is y Max(9.3, 0.5) is 9.3,函数模板的

8、原理分析: 函数模板中声明了类型参数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 a

9、rr1=1,3,0,2,7,6,4,5,2; double arr2=1.2,-3.4,6.8,9,8; cout“arr1数组的最小值为:“ MinArray(arr1,9) endl; cout“arr2数组的最小值为:“ MinArray(arr2,4)endl; ,运行结果: arr1数组的最小值为:0 Arr2数组的最小值为: -3.4,注意点1:实参类型与形参类型必须严格匹配.,#include using namespace std; template T Max ( T a , T b ) return a b ? a : b ; int main ( ) int a=3; f

10、loat b=1.5; cout “ Max (a,b) is “ Max(a,b) endl ; return 0; ,错误!模板类型不能提供类型的隐式转换,注意点2:在函数模板中允许使用多个类型参数。在template定义部分的每个模板形参前必须有关键字class或typename.,#include using namespace std; template void myfunc(T1 x , T2 y) coutx“, “yendl; ,运行结果: 100, hao 3.14, 10,void main() myfunc(100, “hao“); myfunc(3.14, 10L);

11、 ,注意点3:在template语句与函数模板定义语句之间不允许有别的语句。 Template int i; T Max(T x,T y) return(xy)? x : y;,8,/错误,不允许有别的语句,模板优缺点,优点: 函数模板方法克服了C语言用大量不同函数名表示相似功能的弊端; 克服了宏定义不能进行参数类型检查的弊端; 克服了C+函数重载用相同函数名字重写几个函数的繁琐. 缺点: 调试比较困难. 一般先写一个特殊版本的函数 运行正确后,改成模板函数,17,18,【练习2】编写一个函数模板,它返回两个值中的较小者,同时要求能正确处理字符串。 分析: 由于C+字符串比较的方法与字符型、数

12、值型都不同,因此函数模板不适用于字符串比较; 这里设计一个函数模板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=“B

13、ad“,s2=“Good“; cout“输出结果:“endl; coutmin(a,b)endl; coutmin(s1,s2)endl; ,函数模板,函数重载,运行结果: 3.14 Bad,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 m

14、ax_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; ,tem

15、plate 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; M

16、ax( 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 ); myFunct

17、ion( 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 返回值类型 类模板名:成员函数名(参数表) ,类模

18、板的定义,30,用类模板定义对象的写法如下: 类模板名 对象名(构造函数实际参数表); 如果类模板有无参构造函数, 那么也可以只写: 类模板名 对象名;,类模板的定义,31,Pair类模板: template class Pair public: T1 key; /关键字 T2 value; /值 Pair(T1 k,T2 v) : key(k), value(v) ; bool operator ,类模板的定义,32,#include #include using namespace std; 。 void main() Pair stu(“Tom“, 19); Pair stu2(“Jac

19、k“, 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 n

20、amespace 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 A public: template void Func(T2 t); ; template template

21、void 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,CArr

22、ay 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

23、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 c

24、lass 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+支持两种编

25、译模式 包含模式 ( 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. 矩阵运算:矩阵转置与矩阵相

26、乘函数模板。下标作为参数传递。,2.线性表是数据结构中的概念。数组中除第一个元素外,其他元素有且仅有一个直接前驱,第一个元素没有前驱;除最后一个元素外,其他元素有且仅有一个直接后继,最后一个元素无后继。这样的特性称为线性关系。所以称数组元素在一个线性表中。线性表实际包括顺序表(数组)和链表。,对顺序表的典型操作包括:计算表长度,寻找变量或对象x(其类型与表元素相同)在表中的位置(下标值),判断x是否在表中,删除x,将x插入列表中第i个位置,寻找x的后继,寻找x的前驱,判断表是否空,判断表是否满(表满不能再插入数据,否则会溢出,产生不可预知的错误),取第i个元素的值。,作业,48,堆栈类及其模板

27、实现,class CStack public: 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,函数、类

28、、类的成员函数作为类模板的友元,void Func1() class A ; class B public: 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 Pair private: T1 ke

29、y; /关键字 T2 value; /值 public: Pair(T1 k,T2 v):key(k),value(v) ; bool operator ,53,函数模板作为类模板的友元,template bool 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 nam

30、espace 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; t

31、emplate class A public: void Func( const T ,template class B private : 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;

32、 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; ,输出结果: 2 2 1,C+ STL,一、STL概述,STL是一个具有工业强度的,高效的C+程序库 包

33、含了诸多在计算机科学领域里所常用的基本数据结构和基本算法 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中的基本概念

34、,容器:可容纳各种数据类型的数据结构 迭代器:可访问容器中元素的特殊指针 算法:用来操作容器中元素的函数模板 函数对象: 是一个行为类似函数的对象,可象函数一样调用。 例如,向量Vector就是容器, iterator是迭代器。 STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,最基本的,遍历结构,对数据结构的操作,C+STL是通用数据结构和算法的封装!,C+STL中,容器(container)就是通用的数据结构。 容器用来承载不同类型的数据对象; C+中的容器还存在一定的“数据加工能力” 它如同一个对数据对象进行加工的模具,可以把不同类型的数

35、据放到这个模具中进行加工处理,形成具有一定共同特性的数据结构。 例如, 将int型、char型或者float型放到队列容器中,就分别生成int队列、char型队列或者float型队列. 它们都是队列,具有队列的基本特性,但是具体数据类型是不一样的。,概念 之 容器,就如同现实生活中,人们使用容器用来装载各种物品一样,66,概念 之 容器适配器,C+STL容器适配器用来扩充7种基本容器: stack:栈(LIFO) queue:队列(FIFO) priority_queue:优先级队列,67,概念 之 迭代器,用于指向容器中的元素。 通过迭代器可以读取它指向的元素。 迭代器是泛化的指针,可用“+

36、”改变其指向位置,可用“*”访问内容。,68,68,概念 之 算法,C+STL包含70多个算法。 包括:查找、排序、比较、变换、置换、容器管理等。 算法是通用的,可作用于不同的类对象和预定义类型数据。,69,69,STL组件间的关系,C+STL将迭代器和函数对象作为算法的参数,提供了极大灵活性。 使用 STL提供的或自定义的迭代器,配合STL算法,可组合出各种各样强大的功能。,STL头文件一览,容器的基本功能与分类,容器是容纳、包含一组元素或元素集合的对象。 七种基本容器: 向量(vector) 双端队列(deque) 列表(list) 集合(set) 多重集合(multiset) 映射(ma

37、p) 多重映射(multimap) C+STL的容器各有不尽相同的功能和用法。,71,二、顺序容器,顺序容器(sequence container)简介,顺序容器(也称“序列式容器”)将一组具有相同类型的元素以严格的线性形式组织起来。 三类顺序容器: (1) vector 头文件 实际上是动态数组。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能。 (2) deque 头文件 也是动态数组,随机存取任何元素都能在常数时间完成(但性能次于vector)。在两端增删元素具有较佳的性能。 (3) list 头文件 双向链表,在任何位置增删元素都能在常数时间完成。不支持随机存取。,73

38、,关联容器简介,关联容器内的元素是排序的,插入任何元素,都按相应的排序准则来确定其位置。 特点是在查找时具有非常好的性能。 通常以平衡二叉树方式实现,插入和检索的时间都是 O(logN) 四种关联容器: (1) set/multiset: 头文件 set 即集合。set中不允许相同元素,multiset中允许存在相同的元素。 (2) map/multimap: 头文件 map与set的不同在于map中存放的是成对的key/value。 并根据key对元素进行排序,可快速地根据key来检索元素 map同multimap的不同在于是否允许多个元素有相同的key值。,类似于Hash表,74,容器适配

39、器简介,(1) stack :头文件 栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则 (2) queue :头文件 队列。插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。 (3) priority_queue :头文件 优先队列。最高优先级元素总是第一个出列。,容器适配器是一种接口类,为已有类提供新的接口 三种容器适配器:,75,容器的共有成员函数,提供容器的通用功能; 所有容器共有的成员函数: 关系运算: =, , =, = , != empty() : 判断容器中是否为空 max_size(): 容器中最多能装

40、多少元素 size(): 容器中元素个数 s1.swap(s2):交换两个容器的内容 构造函数、拷贝构造函数、析构函数,76,容器的共有成员函数(续),所有顺序容器和关联容器 共有的成员函数: begin():返回指向容器中第一个元素的迭代器 end():返回指向容器中最后一个元素后面的位置的迭代器 rbegin(): 返回指向容器中最后一个元素的迭代器 rend(): 返回指向容器中第一个元素前面的位置的迭代器 erase(): 从容器中删除一个或几个元素 clear(): 清空容器,77,所有容器都具有的成员函数,顺序和关联容器共同支持的成员函数,【例1】创建两个整型向量容器,分别从尾端增

41、加一些值,输出两个容器的元素数、两个容器的比较结果,交换两个容器后再输出一次。,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 v2“v2“endl; return 0; ,声明2个向量,向量赋值,求元素数,向量内容比较,交换2个向量,1、vector向量容器,实际上就是动态数组。但它比数组更灵活,当添加数据时,vecto

42、r的大小能够自动增加以容纳新的元素。 内存自动管理。可动态调整所占内存。 支持随机访问,随机访问时间为常数。 所有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

43、个元素,每个元素值均为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元素,可用“ ”运

44、算符访问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 vector for( int ix=0; ix 100; +ix) ivecix = ix;

45、 /ivec has no element ,出错,向量中尚没有元素,不能访问!,(3) 用迭代器访问vector元素,如何使相同的算法能用于不同的数据结构? - 迭代器(算法与容器的”中间人”),87,容器类迭代器定义方法: 容器类名:iterator 变量名; 访问一个迭代器指向的元素: * 迭代器变量名 迭代器上可执行”+” , 指向容器中的下一个元素。 如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值。 使用一个past-the-end值的迭代器来访问对象是非法的,定义迭代器的关键字,88,对照理解,vector:iterator xHere = x.

46、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; /

47、常量迭代器 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 *

48、 it3 “,“; cout endl; return 0; ,(1)const_iterator :常量迭代器。可以使用这种类型的迭代器来指向一个只读的值。 (2) reverse_iterator :反向迭代器。用来反转遍历vector的各元素,注意用rbegin()来代替begin(),用rend()代替end(),而此时的“+”操作符会朝向后的方向遍历。 (3)iterator:随机迭代器,可任意方向或移动任意个位置访问。,vector的迭代器,有const限制的只可读取元素值,不可修改元素值,90,不同的容器,STL提供的迭代器功能各不相同。 vector容器的迭代器: 可使用“+=”、“-”、“+”、“-=”中的任何一种操作符 可使用“”、“=”

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1