最近在看数据结构方面的书籍,遇到了泛型编程方面的问题,以前遇到的泛型编程问题不多,大多数也已经遗忘,于是打算重新捡起来。下面一段关于泛型编程的定义摘抄于百度百科,应该能概括什么事泛型编程。
泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。STL以迭代器 (Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(function objects)。STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。
上面的概括只是从理论上解释了什么是泛型,可是看过后还是不知道怎么使用泛型,于是乎笔者找到了STL中定义的头文件,下面就一步一步解开泛型的秘密。
由于原版的STL中很多类的套嵌,不便于解释,所以简化了STL,以下以vector容器为例:
文件名:vector.h
1: template //模板定义了Object类型,在使用的时候可以以任何类型代替此类型
2: class vector
3: {
4: public:
5: explicit vector( int initSize = 0 ) : theSize( initSize ), theCapacity( initSize + SPARE_CAPACITY )//重点注意构造函数的定义,构造函数支持两种方式初始化vector容器,这下知道怎么用vector了吧
6: { objects = new Object[ theCapacity ]; }
7: vector( const vector & rhs ) : objects( NULL )
8: { operator=( rhs ); }
9: ~vector( )
10: { delete [ ] objects; }
11:
12: bool empty( ) const
13: { return size( ) == 0; }
14: int size( ) const
15: { return theSize; }
16: int capacity( ) const
17: { return theCapacity; }
18:
19: Object & operator[]( int index )
20: {
21: #ifndef NO_CHECK
22: if( index < 0 || index >= size( ) )
23: throw ArrayIndexOutOfBoundsException( index, size( ) );
24: #endif
25: return objects[ index ];
26: }
27:
28: const Object & operator[]( int index ) const
29: {
30: #ifndef NO_CHECK
31: if( index < 0 || index >= size( ) )
32: throw ArrayIndexOutOfBoundsException( index, size( ) );
33: #endif
34: return objects[ index ];
35: }
36:
37: const vector & operator = ( const vector & rhs );
38: void resize( int newSize );
39: void reserve( int newCapacity );
40:
41: // Stacky stuff
42: void push_back( const Object & x );
43: void pop_back( );
44: const Object & back ( ) const;
45:
46: // Iterator stuff: not bounds checked
47: typedef Object * iterator;
48: typedef const Object * const_iterator;
49:
50: iterator begin( )
51: { return &objects[ 0 ]; }
52: const_iterator begin( ) const
53: { return &objects[ 0 ]; }
54: iterator end( )
55: { return &objects[ size( ) ]; }
56: const_iterator end( ) const
57: { return &objects[ size( ) ]; }
58:
59: enum { SPARE_CAPACITY = 16 };
60:
61: private:
62: int theSize;
63: int theCapacity;
64: Object * objects;
65: };
文件名:vector.cpp
1: template //模板定义了Object类型,在使用的时候可以以任何类型代替此类型
2: const vector & vector::operator=( const vector & rhs )//重载赋值操作符
3: {
4: if( this != &rhs )//优化a=a的情况
5: {
6: delete [ ] objects;
7: theSize = rhs.size( );
8: theCapacity = rhs.theCapacity;
9:
10: objects = new Object[ capacity( ) ];
11: for( int k = 0; k < size( ); k++ )
12: objects[ k ] = rhs.objects[ k ];
13: }
14: return *this;
15: }
16:
17: //以下为一些常用操作函数的定义
18:
19: template
20: void vector::resize( int newSize )
21: {
22: if( newSize > theCapacity )
23: reserve( newSize * 2 );
24: theSize = newSize;
25: }
26:
27:
28: template
29: void vector::reserve( int newCapacity )
30: {
31: Object *oldArray = objects;
32:
33: int numToCopy = newCapacity < theSize ? newCapacity : theSize;
34: newCapacity += SPARE_CAPACITY;
35:
36: objects = new Object[ newCapacity ];
37: for( int k = 0; k < numToCopy; k++ )
38: objects[ k ] = oldArray[ k ];
39:
40: theSize = numToCopy;
41: theCapacity = newCapacity;
42:
43: delete [ ] oldArray;
44: }
45:
46:
47: template
48: void vector::push_back( const Object & x )
49: {
50: if( theSize == theCapacity )
51: reserve( 2 * theCapacity + 1 );
52: objects[ theSize++ ] = x;
53: }
54:
55:
56: template
57: void vector::pop_back( )
58: {
59: if( empty( ) )
60: throw UnderflowException( "Cannot call pop_back on empty vector" );
61: theSize--;
62: }
63:
64:
65: template
66: const Object & vector::back( ) const
67: {
68: if( empty( ) )
69: throw UnderflowException( "Cannot call back on empty vector" );
70: return objects[ theSize - 1 ];
71: }
2017年计算机等级考试二级C++辅导:从STL中学习泛型编程.doc正在阅读:
2017年计算机等级考试二级C++辅导:从STL中学习泛型编程12-12
学生课外活动心得体会【四篇】08-28
那一刻的感动作文800字08-30
2022年重庆合川成人高考准考证发放时间:考前一天09-20
2018年河北中医执业医师考试成绩查询入口【已开通】07-21
借景抒情的作文600字初中梅花-初中借景抒情的600字作文三篇10-27
沉重的书包作文400字12-23
2021江苏无锡市梁溪区教育系统招聘全日制普通高校应届毕业生公告(二)10-04
中元节怀念父亲的经典句子:关于中元节的经典祝福句子03-28
我心目中的妈妈作文500字09-02