函数对象和模版,迭代器的const 引用——std::sort遇到的问题

本文介绍了如何使用C++中的std::sort对包含指针的vector进行排序,并详细讨论了模板和函数对象的应用,同时对比了VC与GCC编译器的不同表现。

先声明,各个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),需要采用归并排序)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值