定义域头文件<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>>