正文

总结:函数模版(template)的使用2006-06-11 23:18:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/bclz/15741.html

分享到:


1、c++是强类型语言,不容易实现“为每个函数实例都显式定义一个函数”
2、宏定义和模扳提供了这种方法
3、宏定义的方法
    #define min(a,b)   ((a)<(b)?(a):(b))
    这种方法对于简单的min()调用可以正常工作
    但是,复杂调用时行为不可预期!!因为它的机制并不像函数调用那样工作,而只是简单地提供参数的替换
    结果是,它的参数都被替换两次:一次在参数的测试中,另一次在宏的返回值被计算期间。
4、函数模版提供了一种用来自动生成各种类型函数实例的方法。
   程序员对于函数接口中的全部或者部分类型进行参数化(parameterize),而函数保持不变。

5、例1:求两个数中较小者
template <class Type>
    Type minm(Type a,Type b)
    {
         return a<b?a:b;
    }
    
int main()
{
    minm(10;20);
    minm(10.0,20,0);
    return 0;
}

6、例2    STL库中堆栈的用法   <stack>
///////6.1  简单的push(),pop()实现<deque>   <stack>
#include <iostream>
#include <stack>
using namespace std;

typedef stack<int> ints;//函数模版的实例化
typedef deque<char>  chars;

int main()
{
/*    int a[10];
    ints p;
    for(int i=0;i<10;i++)
        p.push(i);
    for(i=0;i<10;i++)
    {
        cout<<p.top()<<endl;
        p.pop();
    }

*/
    chars c; 
    char a[10]={'a','b','c','d','e','f','g','h','i','j'};
    for(int i=0;i<10;i++)
        c.push_back(a[i]);
    for(i=0;i<10;i++)
    {
        cout<<c.front()<<endl;
        c.pop_front();
    }
    system("PAUSE");
    return 0;
}

/////6.2   汉诺塔的非递归实现
#include <iostream>
#include <stack>
using namespace std;

#define print_oprt(op) cout<<"move disk "<<(op).begin<<" from \'"<<(op).src<<"\'to\'"<<(op).dst<<"\'"<<endl;

class oprt;

typedef stack<oprt> oprt_stack; 


//define the operation
class oprt
{
public:
    oprt(){};
    ~oprt(){};
    int begin,end;
    char src,dst,bri;
    prt(){};
    oprt(int rbegin,int rend,char rsrc,char rdst,char rbri):
    begin(rbegin),end(rend),src(rsrc),dst(rdst),bri(rbri){}
};


int hanoi_s(int size,char src,char dst,char bri)
{
    oprt_stack ostack;
    oprt tmp;
    ostack.push(oprt(1,size,src,dst,bri));
    while (!ostack.empty())
    {
        tmp = ostack.top();
        ostack.pop();
        if (tmp.begin != tmp.end)
        {
            ostack.push(oprt(tmp.begin,tmp.end-1,tmp.bri,tmp.dst,tmp.src));
            ostack.push(oprt(tmp.end,tmp.end,tmp.src,tmp.dst,tmp.bri));
            ostack.push(oprt(tmp.begin,tmp.end-1,tmp.src,tmp.bri,tmp.dst));
        }
        else
            print_oprt(tmp);
    }
    return 0;
}

void main()
{
    hanoi_s(3,'x','y','z');
}


6、结论,1.如果一个函数的实现在一组实例上保持不变,并且每个实例都处理一种唯一的数据类型,则该函数就是模版的最佳候选者
     2.学会了调用用模板定义的函数

阅读(9268) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册