先声明,各个std库实现不一样,因此有必要按照标准的来。
经常需要对vector进行排序,但是vector常存放的是指针
template<class T>
struct StatLess{
bool operator()(const T& first,const T& second)const{
return first->value<second->value;
}
};
struct LinkStatRecord
{
int value;
};
int main(int argc,char*argv[])
{
std::vector<LinkStatRecord*> vec;
vec.reserve(5);
std::sort(vec.begin(),vec.end(),StatLess<LinkStatRecord*>());
return 0;
}
这是个演示例子,vec是空的,但程序是可以正常编译运行的。
可以看到的上面的模版类似乎很多余,看起来T的类型就是 LinkState*,于是改成如下:
struct StatLess{
bool operator()(const LinkStatRecord* first,const LinkStatRecord* second)const{
return first->value<second->value;
}
};
这个可以在VC(2005,2008,)编译器都可以,但是这个是错误的。gcc如下:
错误:对‘sort(__gnu_cxx::__normal_iterator<LinkStatRecord**, std::vector<LinkStatRecord*, std::allocator<LinkStatRecord*> > >, __gnu_cxx::__normal_iterator<LinkStatRecord**, std::vector<LinkStatRecord*, std::allocator<LinkStatRecord*> > >, StatLess)’的调用没有匹配的函数
类似的,还有引用,一定要用const如下面的const&限定
bool operator()(const T& first,const T& second)const{
return first->value<second->value;
}
如果没有const限定,也是在VC编译器中可行,gcc错误。
顺便说下std::sort,它的第三个函数对象或者函数都是可以的,类似的,如果使用比较函数可以写成
bool compare(const T& first,const T& second){
return first->value<second->value;
}
同理,如果用引用,必须要使用const限定,当然最好也是用const引用方式。
不少书上说,函数对象可以内联,而函数方式不能内联(调用的时候传入的是指针),因此,建议用函数对象(Function Object);这个似乎站不住脚(没有去确认)。
sort是不稳定排序,如果需要稳定stable_sort,用法相同。但实现是不同的,stable_sort要复杂得多,算法复杂度也有区别(如果空间不够,N*log2(N)*log2(N),空间足够Nlog2(N),需要采用归并排序)