C++ 自定义类的sort 重写比较函数,出错 了,大神求现身

tortoisedream 2013-06-19 10:23:31
现在在用mfc写大作业,遇到重写sort比较函数的问题
定义类
class final
{
public:
CString a;
double b;
};
这个是重写函数:
bool CSort::compare(final *v1, final *v2)
{
return (v1->b > v2->b);
}
这个是调用:
std::sort(f[0],f[count+1],compare);
count是我数组的长度,前面已经初始化完了
问题:
error C2664: 'void __cdecl std::sort(class CSort::final *,class CSort::final *,bool (__thiscall *)(class CSort::final *,class CSort::final *))' : cannot convert parameter 3 from 'bool (class CSort::
final *,class CSort::final *)' to 'bool (__thiscall *)(class CSort::final *,class CSort::final *)'
None of the functions with this name in scope match the target type
求大神帮忙,顺便可否解释下原理,感谢,或者提供能给自定义类的比较某个值的方法~~
...全文
570 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tortoisedream 2013-06-20
  • 打赏
  • 举报
回复
引用 12 楼 ri_aje 的回复:
[quote=引用 11 楼 tortoisedream 的回复:] [quote=引用 10 楼 ri_aje 的回复:] 重新帖一下。

class final
{
 public:
  CString a;
  double b;
  static bool compare (final *v1,  final *v2)
  {
   return (v1->b > v2->b);
  };
};

int main ()
{
 final* f [50];
 std::sort(f,f+50,final::compare);
}
你好,这样没报错,但是我进去之后从下标0开始读,还是和原来的顺序一样,就是他们的double还是乱序排列[/quote] 帮你试了一下,没问题。

#include <algorithm>
#include <cstdlib>
#include <iostream>

struct final
{
 double b;
 static bool compare (final const* v1, final const* v2)
 {
  return v1->b > v2->b;
 };
};

int main()
{
 srand(time(0));

 final* f [50];
 for (size_t i = 0, I = 50; i != I; ++i)
 {
  f[i] = new final{double(rand()%100)};
 }

 std::cout << "before sorting" << std::endl;
 for (size_t i = 0, I = 50; i != I; ++i)
 {
  std::cout << f[i]->b << " ";
 }
 std::cout << std::endl;

 std::sort(f,f+50,final::compare);

 std::cout << "after sorting" << std::endl;
 for (size_t i = 0, I = 50; i != I; ++i)
 {
  std::cout << f[i]->b << " ";
 }
 std::cout << std::endl;
}
还不行的话,你就上全代码吧。[/quote] 行了!谢谢
ri_aje 2013-06-20
  • 打赏
  • 举报
回复
引用 11 楼 tortoisedream 的回复:
[quote=引用 10 楼 ri_aje 的回复:] 重新帖一下。

class final
{
 public:
  CString a;
  double b;
  static bool compare (final *v1,  final *v2)
  {
   return (v1->b > v2->b);
  };
};

int main ()
{
 final* f [50];
 std::sort(f,f+50,final::compare);
}
你好,这样没报错,但是我进去之后从下标0开始读,还是和原来的顺序一样,就是他们的double还是乱序排列[/quote] 帮你试了一下,没问题。

#include <algorithm>
#include <cstdlib>
#include <iostream>

struct final
{
 double b;
 static bool compare (final const* v1, final const* v2)
 {
  return v1->b > v2->b;
 };
};

int main()
{
 srand(time(0));

 final* f [50];
 for (size_t i = 0, I = 50; i != I; ++i)
 {
  f[i] = new final{double(rand()%100)};
 }

 std::cout << "before sorting" << std::endl;
 for (size_t i = 0, I = 50; i != I; ++i)
 {
  std::cout << f[i]->b << " ";
 }
 std::cout << std::endl;

 std::sort(f,f+50,final::compare);

 std::cout << "after sorting" << std::endl;
 for (size_t i = 0, I = 50; i != I; ++i)
 {
  std::cout << f[i]->b << " ";
 }
 std::cout << std::endl;
}
还不行的话,你就上全代码吧。
tortoisedream 2013-06-20
  • 打赏
  • 举报
回复
引用 10 楼 ri_aje 的回复:
重新帖一下。

class final
{
 public:
  CString a;
  double b;
  static bool compare (final *v1,  final *v2)
  {
   return (v1->b > v2->b);
  };
};

int main ()
{
 final* f [50];
 std::sort(f,f+50,final::compare);
}
你好,这样没报错,但是我进去之后从下标0开始读,还是和原来的顺序一样,就是他们的double还是乱序排列
ri_aje 2013-06-20
  • 打赏
  • 举报
回复
重新帖一下。

class final
{
 public:
  CString a;
  double b;
  static bool compare (final *v1,  final *v2)
  {
   return (v1->b > v2->b);
  };
};

int main ()
{
 final* f [50];
 std::sort(f,f+50,final::compare);
}
ri_aje 2013-06-20
  • 打赏
  • 举报
回复
引用 8 楼 tortoisedream 的回复:
[quote=引用 7 楼 rocktyt2 的回复:] 将compare改成全局函数 CSort成员函数compare隐式带有一个CSort的参数,std::sort用不了
你好,我是在做一个mfc工程,然后把所有函数操作过程都放在一个Csort类里面,在窗口那里生成一个对象,然后直接调用CSort,那我要把compare写到哪里??[/quote] 可以用静态成员函数。

class  final
{
public:
CString a;
double b;
static bool compare (final *v1,  final *v2)
{    
return (v1->b > v2->b);
};
std::sort(f,f+count,final::compare);
};
tortoisedream 2013-06-20
  • 打赏
  • 举报
回复
引用 7 楼 rocktyt2 的回复:
将compare改成全局函数 CSort成员函数compare隐式带有一个CSort的参数,std::sort用不了
你好,我是在做一个mfc工程,然后把所有函数操作过程都放在一个Csort类里面,在窗口那里生成一个对象,然后直接调用CSort,那我要把compare写到哪里??
rocktyt 2013-06-20
  • 打赏
  • 举报
回复
将compare改成全局函数 CSort成员函数compare隐式带有一个CSort的参数,std::sort用不了
tortoisedream 2013-06-20
  • 打赏
  • 举报
回复
引用 4 楼 u010936098 的回复:
f 是什么? 如果f是final*或是final[] 则:

class CSort
{
public:
  static bool compare(final const & v1,  final const & v2);
//std::sort要求函数对象,或是静态/全局函数指针
//非静态成员函数指针不能直接传递给std::sort

};

bool CSort::compare(final const & v1,  final const & v2)
{    
return (v1.b > v2.b);
}
这个是调用:
std::sort(&f[0],&f[count],CSort::compare);
//[ ]会消引用,所以要加上&操作符。
//count是数量就不要加1 ,是下标上界就加1
如果f是final **或是(final *)[],则:

class final_compare
{
public:
  bool operator()(final const * v1,  final const * v2)const;
//这回用函数对象演示

};

bool final_compare::operator()(final const * v1,  final const * v2) const
{    
return (v1->b > v2->b);
}

//调用还是要加&,构造一个函数对象代替函数指针
std::sort(&f[0],&f[count],final_compare());

由于是大于判断,所以是逆序。
那个final我是这么定义的,test 是我建的一个图,文档数值对: final* f[50]; std::map<CString,double>::iterator test; test=buf.begin(); int count=0; while(test!=buf.end()) { f[count]=new final(); f[count]->a=test->first; f[count]->b=test->second; test++; count++; } 照着你两个方法好像哪里有问题,错了,我是建立在一个CSort类里面的,怎么办??
gogiqp_jyh 2013-06-19
  • 打赏
  • 举报
回复
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

class final{
    public:
        final(int i):i(i){}
        string str;
        int i;
};

bool com(final *ls, final *rs)
{
    return (ls->i > rs->i);
}

int main(int argc, char **argv){
    final f1(2);
    final f2(1);
    final f3(3);

    vector<final*> vecFinal;
    vecFinal.push_back(&f1);
    vecFinal.push_back(&f2);
    vecFinal.push_back(&f3);
    
    cout << vecFinal[0]->i << "-" << vecFinal[1]->i << "-" << vecFinal[2]->i << endl;    
    sort(vecFinal.begin(), vecFinal.end(), com);
    cout << vecFinal[0]->i << "-" << vecFinal[1]->i << "-" << vecFinal[2]->i << endl;    

    return 0;
}
橡木疙瘩 2013-06-19
  • 打赏
  • 举报
回复
f 是什么? 如果f是final*或是final[] 则:

class CSort
{
public:
  static bool compare(final const & v1,  final const & v2);
//std::sort要求函数对象,或是静态/全局函数指针
//非静态成员函数指针不能直接传递给std::sort

};

bool CSort::compare(final const & v1,  final const & v2)
{    
return (v1.b > v2.b);
}
这个是调用:
std::sort(&f[0],&f[count],CSort::compare);
//[ ]会消引用,所以要加上&操作符。
//count是数量就不要加1 ,是下标上界就加1
如果f是final **或是(final *)[],则:

class final_compare
{
public:
  bool operator()(final const * v1,  final const * v2)const;
//这回用函数对象演示

};

bool final_compare::operator()(final const * v1,  final const * v2) const
{    
return (v1->b > v2->b);
}

//调用还是要加&,构造一个函数对象代替函数指针
std::sort(&f[0],&f[count],final_compare());

由于是大于判断,所以是逆序。
gogiqp_jyh 2013-06-19
  • 打赏
  • 举报
回复
cannot convert parameter 3 from 'bool (class CSort:: final *,class CSort::final *)' to 'bool (__thiscall *)(class CSort::final *,class CSort::final *)' 说明你给compare传的值有问题, 调用比较函数错误。 你可以试试二楼的答案。直接上指针
iamnobody 2013-06-19
  • 打赏
  • 举报
回复
std::sort(f,f + count,compare);
tortoisedream 2013-06-19
  • 打赏
  • 举报
回复
谢谢大神们!!!!!!!

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧