资源预览内容
第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
第9页 / 共49页
第10页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
模板与标准模板库,代码重用的另一种方式:模板类 7.1 模板的基本知识 一个模板类至少具有一个类参数,类参数是个符号以表示将要被某个确定数据类型代替的类型。 class intArray public: int ,private: int* a; int size; intArray(); /* for emphasis int dummy_val;/arbitrary value ; int ,const int ,/# /# 模板类方式 # /# template class Array public: T,template T ,template const T ,template Array:Array( int s ) a = new T size = s ; template Array:Array() delete a; ,template ostream ,7.1.1 模板实例 #include using namespace std; /declaration of template class Array int main() Array a1(100);/array of 100 doubles a1 6 = 3.14; couta16endl; /. ,例子: template class Array /. ; Array a0(50); Array a1( 50 ); template Array a2( 50 ); Array a3( 50 );,7.1.2 参数表中的模板类 模板类可以作为一种数据类型出现在参数表中。 template ostream ,7.2 函数模板 template T Max(T t , int n) int i = 0; T temp = t0; for (i=1; in; i+) if (temp ti) temp = ti; return temp; ,template void swap(T ,7.3 标准模板库STL 标准模板库(STL)是标准C+库的一部分。 7.3.1 容器、算法和迭代器 STL容器:vector stack queue deque list set map等 STL算法:copy sort search merge permute等 STL提供了多种类型的迭代器,可分别进行正向、反向、双向和随机遍历操作。 7.3.2 STL的优越性,int sq ( int ); void main() vector v(10); /fill up v with value; for (int i = 0; i 10; i+) v.push_back( i ); for_each(v.begin(), v.end(), sq); int sq ( int a ) return a * a; ,#include #include #include using namespace std; void main() vector v(10); deque d; sort( v.beging(), v.end() ); sort( d.begin(), d.end() ); ,7.3.3 容器基础知识 STL基本容器可以分为两组:序列式容器和关联式容器。 序列式容器如同数组,可以通过下标来访问。 ( list vector deque ) 关联式容器中的元素可以通过键值(key)来访问,关联式容器可以将任意类型的数据作为键值来使用。( map multimap set multiset) float gnp = m “ China “;,#include #include int main( ) using namespace std; vector :iterator v1_Iter, v2_Iter, v3_Iter, v4_Iter, v5_Iter; / Create an empty vector v0 vector v0; / Create a vector v1 with 3 elements of default value 0 vector v1( 3 ); / Create a vector v2 with 5 elements of value 2 vector v2( 5, 2);,/ Create a copy, vector v4, of vector v2 vector v4( v2 ); vector v5( v4.begin( ) + 1, v4.begin( ) + 3 ); cout v1 = ; for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter+ ) cout *v1_Iter; cout endl; cout v2 = ; for ( v2_Iter = v2.begin( ) ; v2_Iter != v2.end( ) ; v2_Iter+ ) cout *v2_Iter; cout endl;,cout v4 = ; for ( v4_Iter = v4.begin( ) ; v4_Iter != v4.end( ) ; v4_Iter+ ) cout *v4_Iter; cout endl; cout v5 =; for ( v5_Iter = v5.begin( ) ; v5_Iter != v5.end( ) ; v5_Iter+ ) cout *v5_Iter; cout endl; ,7.3.4 基本序列式容器:vector、deque和list #include #include using namespace std; int main() int i; vector nums; nums.insert( nums.begin(), -999); nums.insert( nums.begin(), 15); nums.insert( nums.end(), 60);,for ( i = 0; i nums.size(); i+) cout numsi endl;/15 -999 60 cout endl; nums.erase( nums.begin() );/-999 60 nums.erase( nums.begin() );/60 for ( i = 0; i nums.size(); i+) cout numsi endl;/60 return 0; ,#include #include #include using namespace std; void dump( list ,names.reverse(); cout ,#include #include using namespace std; int main( ) vector c1; vector :iterator c1_Iter; vector :const_iterator c1_cIter; c1.push_back( 1 ); c1.push_back( 2 );,c1_Iter = c1.begin( ); cout The first element of c1 is *c1_Iter endl; *c1_Iter = 20; c1_Iter = c1.begin( ); cout The first element of c1 is now *c1_Iter endl; / The following line would be an error because / iterator is const c1_cIter = c1.begin( ); *c1_cIter = 200; ,7.3.5 vector、deque和list的效率比较 7.3.6 基本关联式容器:set、multiset、map 和multimap #include #include using namespace std; int main() set s; s.insert( - 999 ); s.insert( 18 ); s.insert( 321 ); s.insert( -999 ); set:const_iterator it; it = s.begin();,while ( it != s.end() cout key; it = s.find( key ); if (it = s.end() cout key is not in set. endl; else cout key is in set. endl; return 0; ,#include #include #include using namespace std; int main() map m; m zero = 0; m one = 1; m two = 2; m three = 3;,m four = 4; m five = 5; m six = 6; m seven = 7; m eight = 8; m nine = 9; cout m three endl m five endl m seven endl; return 0; ,7.3.7 容器适配器 容器适配器是基本容器的衍生物,并利用基本容器来实现其特定的功能。容器适配器有三种:stack、 queue和priority_queue. 默认情况下STL stack衍生自deque stack s; stack s; 如果要改变成vector的衍生,则用如下方式: stack s;,#include #include #include using namespace std; int main() const string prompt = Enter an algebraic expression: ; const char lParen = ( ; const char rParen = ) ; stack s; string buf;,cout prompt endl; getline( cin, buf ); for ( int i = 0; ibuf.length(); i+) if ( !isspace( bufi ) s.push( bufi ); cout Original expression: buf endl; cout Expression in reverse: ;,while (!s.empty() char t = s.top(); s.pop(); if (t = lparen) t = rParen; else if (t = rParen) t = lParen; coutt; coutendl; return 0; ,#include #include using namespace std; int main() queue q; / = queque int j = -1; for (int i = 0; i 6; i+) q.push( j = j + 2 ); while ( !q.empty() ) cout q.fro
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号