辅助函数_通用工具__STL

来源:互联网 发布:windows扩展屏幕工具 编辑:程序博客网 时间:2024/06/06 12:52

定义域头文件<algorithm>,算法程序库中内含三个辅助函数。


一,挑选较小值和较大者:

定义于头文件<algorithm>中:

namespace std{    template <class T>    inline const T& min(const T& a,const T& b){        return b<a? b:a;    }}

namespace std{    template <class T>    inline const T& max(const T& a,const T& b){        return a<b? b:a;    }}

如果两值相等,通常会返回第一值。不过程序最好不要依赖这一点。


上述两个函数的另一个版本是接受一个额外的template参数作为“比较准则”:

namespace std{    template <class T,class Compare>    inline const T& min(const T& a,const T& b,Compare comp){        return comp(b,a)? b:a;    }}


namespace std{    template <class T,class Compare>    inline const T& max(const T& a,const T& b,Compare comp){        return comp(a,b)? b:a;    }}
其中,作为“比较准则“的那个参数应该是个函数或仿函数(functor),接受两个参数并进行比较:在某个制定规则下,判断第一个参数是否小于第二参数,并返回判断结果。

二,两值互换

函数swap()用来交换两对象的值,其泛华版本定义于头文件<algorithm>中:

namespace std{    template <class T>    inline void swap(T& a,T& b){        T tmp(a);        a=b;        b=tmp;    }}

swap()的最大优势在于,透过template specialization 或 function overloading,我们可以为更复杂的型别提供特殊的实作版本;我们可以交换对象内部成员,不必劳师动众的反复赋值,这无疑将大大节约时间。STL中所有容器以及strings都运用了这项技术。举个例子,有个简单容器,仅仅内含一个array和一个成员(用来指示数组元素数量),那么为它特别实作的swap()可以是这样:

class MyContainer{  private:    int* elems;    int numElems;  public:    ...   ///implementation of swap()    void swap(MyContainer& x){      std::swap(elems,x.elems);      std::swap(numElems,x.numElems);      ...    }};//overloaded global swap() for this typeinline void swap(MyContainer& c1,MyContainer& c2){  c1.swap(c2);//calls implementation of swap()}

这样,调用swap()而非通过反复赋值操作来交换两容器的值,会带来效率上的提升。对于你自己定义的型别,如果确实能够带来效率上的改善,你就应该义不容辞的为它提供swap()的特化版本。


参考资料:<<The C++ Standard Library>>

0 0
原创粉丝点击