鱼C论坛

 找回密码
 立即注册
查看: 5572|回复: 10

为什么我重载了<运算符,但还是不能使用sort对结构体进行排序?

[复制链接]
发表于 2016-8-17 03:08:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
测试代码如下:
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

struct fun
{
        int a;
        int b;
        
        fun()
        {
                a=0;
                b=0;
        }
        
        bool operator < (fun sum)    
        {
                return b < sum.b;
        }
};   //定义结构提  

int main()
{
        fun s[20]={};
        for(int i=1;i<=10;i++)  //对结构体变量进行赋值
        {
                s[i].a=rand()%20;
                s[i].b=rand()%20;
        }
        
        sort(&s[1],&s[11]);  //排序
        return 0;
}



错误信息:
In file included from /usr/include/c++/4.4/algorithm:62,
                 from test.cpp:2:
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = fun]’:
/usr/include/c++/4.4/bits/stl_algo.h:2268:   instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = fun*, _Size = int]’
/usr/include/c++/4.4/bits/stl_algo.h:5220:   instantiated from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = fun*]’
test.cpp:32:   instantiated from here
/usr/include/c++/4.4/bits/stl_algo.h:89: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:90: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:92: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:96: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:98: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers






想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-17 08:24:22 | 显示全部楼层
struct fun 用 类 吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-17 09:42:23 | 显示全部楼层
是class不是struct= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-17 13:30:54 | 显示全部楼层

用类一样不行,而且结构体和类好像没什么区别吧,只是缺省下元素的访问权限一个是public一个是provide
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-17 13:31:39 | 显示全部楼层
黑龍 发表于 2016-8-17 09:42
是class不是struct= =

用类一样不行,而且结构体和类好像没什么区别吧,只是缺省下元素的访问权限一个是public一个是provide
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-17 14:07:13 | 显示全部楼层
hyq510 发表于 2016-8-17 13:31
用类一样不行,而且结构体和类好像没什么区别吧,只是缺省下元素的访问权限一个是public一个是provide

没完 你这个重载是怎么重载的= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-19 11:12:31 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-20 22:17:28 | 显示全部楼层
本帖最后由 Krant5 于 2016-8-20 22:18 编辑

我改了一下没有错误了,至于对不对就不好说了,还是用类吧,另外,将重载运算符用友元函数类型才是正确的
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

class fun
{
        public:
                int a;
                int b;

                fun()
                {
                        a=0;
                        b=0;
                }

                friend bool operator < (fun sum,fun sum1);
};
bool operator < (fun sum,fun sum1)
{
        return sum.b < sum1.b;
} //定义结构提

int main()
{
        fun s[20]= {};
        for(int i=1; i<=10; i++) //对结构体变量进行赋值
        {
                s[i].a=rand()%20;
                s[i].b=rand()%20;
        }

        sort(&s[1],&s[11]);  //排序
        return 0;
}
reload.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 04:53:27 | 显示全部楼层
Krant5 发表于 2016-8-20 22:17
我改了一下没有错误了,至于对不对就不好说了,还是用类吧,另外,将重载运算符用友元函数类型才是正确的

谢谢了,不过我更好奇的是为什么之前那个不行。
如果用之前那个结构体的话,单纯的测试<运算符也能正常工作,但是使用sort排序却不行。


哦,对了,你这个代码把class改成struct也并没有影响。
我记得struct和class的区别只是在于默认访问权限与继承方式。
刘汝佳的书里提到过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-21 22:57:27 | 显示全部楼层
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

class fun{
public:
                int a;
                int b;
                fun():a(0),b(0){}
                friend bool operator < (fun sum1,fun sum2)    
        {
                return sum1.b < sum2.b;
        }
};   //定义结构提  

int main()
{
        fun s[20]={};
        for(int i=1;i<=10;i++)  //对结构体变量进行赋值
        {
                s[i].a=rand()%20;
                s[i].b=rand()%20;
        }
        
        sort(s,s+10);  //排序
        return 0;
}
你的问题应该是重载小于运算的时候需要两个操作数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-22 03:08:59 | 显示全部楼层
iszhuangsha 发表于 2016-8-21 22:57
你的问题应该是重载小于运算的时候需要两个操作数。

谢谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 08:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表