saturnman

saturnman
posts(0) comments(0) trackbacks(0)
  • C++博客
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

文章档案

  • 2010年2月 (1)

搜索

  •  

最新评论

View Post

[原创]阅读STL源码笔记(一)

 

                                                                                 一一容器类型萃取

在实现容器时我们往往要实现一个功能就是容器类型的萃取(这里容器类型指的是容器容纳的元素的类型),这个功能有很多应用,考虑我们的容器容纳内容是另一和容器时,比如list或c字符串时,我们要对容器内的元素的内容进行一个操作,比如乱序重排(shuffle)操作,我们可以调用全局的算法来处理这个问题,如果我们能判断元素的类型,我们就有可能调用效率更加高的元素成员函数或是特有公共函数来处理这个问题,因为某些元素内部只是通过调换内部指针来达到重新排列。

如下是测试代码,我声名一个通用容器container之后又声名两个不同的容器common_element_container和special_element_container,通过对container内有typedef 设置来定义元素类型为一个内部嵌套类型。之后在test_func函数中把container所含元素类型萃取出来,并根据类型的不同调用不同的函数来处理。以此不破坏泛型编程界面且没有运行时效率的损失,因为模版的类型是在编译期由编译器推导完成的,最终代码中不含有相应的运行时开销。C++中引入的函数与类模版template可以看成是一种新型的语言,这个与预编译宏相似,查是宏更多的查找模式与判断,没有类型的概念,而template机制有严格的类型推导机制,泛而不乱。在编译器的编译阶段这种新的模版语言就在编译器中运行起来,进行想应的类型处理与代码产生,其中蕴涵的思想与技巧值值每个程序设计者学习思考。

#include<iostream>

using namespace std;

template
<typename T>

void shuffle(T&);

template
<typename T>

void special_shuffle(T&);

template
<typename T>

class container

{

    
private:

        T value;

    
public:

        container():

            value(T())

    
{

 

    }


    typedef T value_type;

    
void shuffle()

    
{

        value.shuffle();

    }


    T
& get_value()

    
{

        
return value;

    }


}
;

template
<typename T>

class common_element_container // doesn't have high efficiency shuffle()

{

    
private:

        
const static bool traits = false;

    
public:

        
static bool get_traits()

        
{

            
return false;

        }


}
;

template
<typename T>

class special_element_container //has high efficiency shuffle()

{

    
private:

        
const static bool traits = true;

    
public:

        
static bool get_traits()

        
{

            
return true;

        }


}
;

template
<typename T>

void test_func(T& input)

{

    typedef typename T::value_type value_type;

    
if(value_type::get_traits()==true)

    
{

        special_shuffle(input.get_value());

    }


    
else

    
{

        shuffle(input.get_value());

    }


}


template
<typename T>

void shuffle(T& input)  // comman  shuffle() has low efficiency 

{

    
//TO DO

    cout
<<"Low performance global function shuffle called"<<endl;

}


template
<typename T>

void special_shuffle(T& input)

    
{

        
//TO DO

        cout
<<"High performance special function shuffed called"<<endl;

    }


int main()

{

    
//Declare container with different element type

    container
<common_element_container<int> > c1;

    container
<special_element_container<int> > c2;

    
//Test diff behavior of the same containter but diff element type

    cout
<<"For comman_element_container<T> as a element type."<<endl;

    test_func(c1);

    cout
<<"For special_element_container<T> as a element type."<<endl;

    test_func(c2);

    
return 0;

}


学编程不能闭门造车,读书的同时阅读别人优秀代码并自己动手实践是进步最快的一种方式。泛型之路任重而道远,编程之路更是如此。写东西出来并不容易,如果哪位想觉得我的文章不错抑或是以此文为反例请起码标明来源,谢谢。

http://saturnman.blog.163.com/blog/static/5576112010144415423/

参考资料:

SGI STL 源码 http:// www.sgi.com/tech/stl/

候捷 《STL源码剖析》

posted on 2010-02-05 14:52 saturnman 阅读(140) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


 
Powered by:
C++博客
Copyright © saturnman