C++ STL模板与容器 知识 初学 小结 ( 一 )

1. 编程范型

编程范型 或 编程范式(英语Programming paradigm),(范 即模范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格(可以对照方法学)。如:函数式编程程序编程面向对象编程指令式编程等等为不同的编程范型。

编程范型提供了(同时决定了)程序员程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。

正如软件工程中不同的群体会提倡不同的“方法学”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的(如SmalltalkJava支持面向对象编程,而HaskellScheme则支持函数式编程),同时还有另一些语言支持多种范型(如RubyCommon LispPythonOz)。

很多编程范型已经被熟知他们禁止使用哪些技术,同时允许使用哪些。例如,纯粹的函数式编程不允许有副作用[1];结构化编程不允许使用goto。可能是因为这个原因,新的范型常常被那些习惯于较早的风格的人认为是教条主义或过分严格。然而,这样避免某些技术反而更加证明了关于程序正确性——或仅仅是理解它的行为——的法则,而不用限制程序语言的一般性。

编程范型和编程语言之间的关系可能十分复杂,由于一个编程语言可以支持多种范型。例如,C++设计时,支持过程化编程面向对象编程以及泛型编程然而,设计师和程序员们要考虑如何使用这些范型元素来构建一个程序。一个人可以用C++写出一个完全过程化的程序,另一个人也可以用C++写出一个纯粹的面向对象程序,甚至还有人可以写出杂揉了两种范型的程序。

2.泛型编程

2.1 C++的泛型即为模板。

C++泛型的参数可以代表类或个别对象。C++无法对泛型的类型参数进行约束。在编译时,每个被使用的封闭泛型类型(即是所有泛型参数的实际类型都已被指明的泛型)都会有独立的编码产生,编译程序会在此时确保类型安全性。可是如果泛型要运用其泛型参数的某成员,而该泛型参数又不包含该成员的时候,编译程序所产生的错误信息或会看似与实际问题无关,增加除错的难度。

2.2 为什么泛型
泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象,这样的事情;熟悉一些其它面向对象的语言的人应该知道,如Java里面这是通过在List里面存放Object引用来实现的。Java的单根继承在这里起到了关键的作用。然而单根继承对C++这样的处在语言链底层的语言却是不能承受之重。此外使用单根继承来实现通用容器也会带来效率和类型安全方面的问题,两者都与C++的理念不相吻合。
 
于是C++另谋他法——除了单根继承之外,另一个实现通用容器的方案就是使用“参数化类型”。一个容器需要能够存放任何类型的对象,那干脆就把这个对象的类型“抽”出来,参数化它:
 【例】
template<class T> 
class vector 
{
 T* v;
 int sz;
public:
 vector(int);
 T& operator[](int);
 T& elem(int i) { return v[i]; }
 // ...
};
2.3 模板类型及其简单应用

模板处理的数据并不限于某种特定的数据类型;

泛型编程仍需要编写自己的函数和类,但它们的数据类型不受限制。程序员提供的数据类型,编译器可以根据模板即时生成实用代码。

编写代码时,一般使用占位符 (T) 来替代数据类型。

【例】

template<class T>

void fun(T parm)

{

// do sth

}


2.3.1 函数模板

【例】

// swap

......

template<class T>

swap( T &a , T &b )

{

......

}

......

【注】

其实, template< class T >  与 template< typename T > 是一个含义,同等使用;

【另】

如果函数对不同数据类型有相同操作 —— 使用模板;

如果函数对不同数据类型有不同操作 —— 使用重载;

2.3.2 类模板

template< class T >

class myclass

{

myclass( );

void fun( T &a,T &b );

}

【注】

模板构造器的实现,不再像传统的格式书写,即 ‘myclass::myclass()’,这样编译器不知道这是个模板,因此,初始化构造器实现如下:

myclass<T>::myclass

{

// 初始化;

}

例:(FIFO -- 栈操作)

//类模板的定义:

template< class T >

class Stack

{

public:

Stack( unsugned int size = 100 ) ; // 构造器

~Stack( ) ; // 析构器

void push( T value ) ; // 类方法

void pop( ); //类方法

private:

unsigned int size;

unsigned int sp;

T *data;

};

// 构造器 

template<class T>

Stack<T>::Stack ( unsigned int size )

{

this --> size = size;

data = new T [size];

sp = 0;

}

// 析构器

template < class T >

Stack< T >::~Stack( )

{

delete [ ]data;

}

// 类方法

template < class T >

void Stack<T>::push( T value )

{

data [sp++] = value;

}

template< class T>

T Stack<T> ::pop( )

{

return data[--sp];

int main( )

{

Stack< int >int Stack( 100 );

int Stack.push(1);

int Stack.push(11);

int Stack.push(3);

std::cout << int Stack.pop() << "\n";

std::cout<< int Stack.pop() <<"\n";

std::cout<< int Stack.pop() <<"\n";

return( 0 );

}

2.3.3 内联模板

(未完 !)




......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值