辅助函数_通用工具__STL

定义域头文件<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 type
inline void swap(MyContainer& c1,MyContainer& c2){
  c1.swap(c2);//calls implementation of swap()
}

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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值