关于C++sort函数的一些问题

sort() 函数有 2 种用法,其语法格式分别为

1.//对 [first, last) 区域内的元素做默认的升序排序
void sort (RandomAccessIterator first, RandomAccessIterator last);
2.//按照指定的 comp 排序规则,对 [first, last) 区域内的元素进行排序
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

另外,C++ 中的 struct 和 class 非常类似(有关两者区别,可阅读《C++ struct和class到底有什么区别》一文),前者也可以包含成员变量和成员函数。

今天学习了一下sort的函数的使用;然后就出现了一个问题。就是我用typedef把结构体定义成某个类型的时候,它会出现编译错误:

 

但是如果不加那个typedef, 它会正常运行;

struct {
    bool operator()(int a, int b) 
        {   
            return a > b;
    }   
}mycmp1;
    
void test02() 
{

 
	int a[10] = {3,2,1,70,8,9,34,23,24,71};	
	sort(a,a+10);
	print(a,10);
	
	sort(a,a+10,mycmp1);
	print(a,10);
}

 但是如果是这样,又不能通过编译:

struct mycmp1{
    bool operator()(int a, int b) 
        {   
            return a > b;
    }   
};

关于如何自定义一个排序规则,除了《C++ STL关联式容器自定义排序规则》一节介绍的 2 种方式外,还可以直接定义一个具有 2 个参数并返回 bool 类型值的函数作为排序规则。


#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector
//以普通函数的方式实现自定义排序规则
bool mycomp(int i, int j) {
    return (i < j);
}
//以函数对象的方式实现自定义排序规则
class mycomp2 {
public:
    bool operator() (int i, int j) {
        return (i < j);
    }
};
int main() {
    std::vector<int> myvector{ 32, 71, 12, 45, 26, 80, 53, 33 };
    //调用第一种语法格式,对 32、71、12、45 进行排序
    std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71) 26 80 53 33
    //调用第二种语法格式,利用STL标准库提供的其它比较规则(比如 greater<T>)进行排序
    std::sort(myvector.begin(), myvector.begin() + 4, std::greater<int>()); //(71 45 32 12) 26 80 53 33
   
    //调用第二种语法格式,通过自定义比较规则进行排序
    std::sort(myvector.begin(), myvector.end(), mycomp2());//12 26 32 33 45 53 71 80
    //输出 myvector 容器中的元素
    for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
        std::cout << *it << ' ';
    }
    return 0;
}

最后我又把那个结构体改成了类:按照第1种格式声明,它也不能通过编译。最后的原因如上呢:

就是把它当成函数来调用,但它的本质是一个对象。在把那个对象当参数的时候,要在对象后面加括号。这个就有点离谱。是关于STL那个容器的。 现在,终于搞清楚它的实质了; std::sort(myvector.begin(), myvector.end(), mycomp2()),mycomp2.operator();

 所以这样就先告一段落了,这个使用我应该是会了,但是关于它的更底层的东西先放着吧,试考完以后再搞。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值