在类里面如何利用标准库的排序功能,我始终找不到好的方法,有高手能解决100送出

linuxfly 2003-08-30 03:02:36
涉及的类
class Object
{
public;
Point pos();
void GetID();
……
……
private:
Point _pos;
int _id;
}

class go
{
public:
void SortByDistance(const Point& p);
private:
Object obj[5];
int SortedArray[5];
}
//实现部分 ------------------------------------------
// 这是个全局函数,没有问题
inline double dist(const Point& p1, const Point& p2)
{
sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}

// 问题就出在这个函数,这个函数不能写在类里面,而且目标点p没有定义
// 这里目标点p其实是下一个函数传进来的参数
// 这里的比较条件每次都不一定,下一次可能比较其他的内容,如何灵活的修改
bool u_greater(const Object* _left, const Object* _right)
{
return (dist(_left->pos(), p) < dist(_right->pos(), p));
}

inline void go::SortByDistance(const Point& p)
{
list<Object*> objlist;

objlist.push_back(&obj[4]);
objlist.push_back(&obj[1]);
objlist.push_back(&obj[2]);
objlist.push_back(&obj[0]);
objlist.push_back(&obj[3]);

homelist.sort(u_greater); // 这里有问题
for(int i = 0; i < 5; i++)
{
SortedPlayer[i] = (*objlist.begin())->GetID();
homelist.pop_front();
}
}
-------------------------------------------------------
u_greater有问题,得不到目标点p,而且比较条件太死板,不能灵活的修改

请问有哪位高手能解决这个问题,小弟不甚感激
...全文
18 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT_worker 2003-08-30
  • 打赏
  • 举报
回复
等一些不好用的东东,我听说最近的c++标准库扩充了bind,有了这个东东之后你的
sort_by_info就可以写的非常简单了:
sort_by_info(type_it first,type_it last,type_info info){
std::sort( first,last,std::bind(cmp,_1,_2,info) );
}
虽然标准库已经接受了bind但是你手头上的开发环境可能还没有它们,你可以到
http://www.boost.org
去当一个boost库来,那里有bind的全部代码合相信的文档说明。
atEleven 2003-08-30
  • 打赏
  • 举报
回复
还有比较函数也相应修改:
bool u_greater(const Object* _left, const Object* _right)
{
return ( dist(_left->pos (), _left->_tempP) <
dist(_right->pos(), _right->_tempP) );
}
IT_worker 2003-08-30
  • 打赏
  • 举报
回复
我想将你的问题理一下可能能表示的更清晰一些:
你现在有一个函数
bool cmp(type a,type b,info_type info);
这个函数需要info的信息决定a,b的大小比较。
你希望利用std::sort写一个排序函数:
sort_by_info(type_it first,type_it last,info_type info);

然而std::sort接受的比较算子是一个二元函数,这样你的info信息好像无法参与运算,对于这种情况一般有两种方法:
一:利用全局变量写一个函数,代码如下:
info_type g_info;
bool cmp1(type a,type b){ return cmp(a,b,g_info); }
sort_by_info(type_it first,type_it last,info_type info){
g_info = info;
std::sort(first,last,cmp1);
}
二:写一个比较函数子:
struct cmp_f{
info_type m_info;
cmp_f(info_type info):m_info(info){}
bool operator(type a,type b){ return cmp(a,b,m_info);}
}

sort_by_info(type_it first,type_it last,type_info info){
std::sort( first,last,cmp_f(info) );
}

然而这些方法都不是足够的方便,这是因为原有的c++标准库中对函数子的运算支持太弱(紧紧有一些not,bind1st,bind2dnd
atEleven 2003-08-30
  • 打赏
  • 举报
回复
呵呵.贴上去突然就明白楼主的意思了.
是不是说p没有机会传入?


这样试一下,把p当做Object的一个成员变量.这个成员变量只有每次要比较的时候才赋值,象这样:

class Object
{
public;
Point pos();
void GetID();
……
……

public:
Point _tempP;

private:
Point _pos;
int _id;
}

//------------------------------------------------
obj[4]._tempP = p;
objlist.push_back(&obj[4]);
obj[1]._tempP = p;
objlist.push_back(&obj[1]);
obj[2]._tempP = p;
objlist.push_back(&obj[2]);
obj[0]._tempP = p;
objlist.push_back(&obj[0]);
obj[3]._tempP = p;
objlist.push_back(&obj[3]);

objlist.sort(u_greater);

//之后再把_tempP清掉.
atEleven 2003-08-30
  • 打赏
  • 举报
回复
没有理解楼主那几句注释,不知道是不是说p当参数传入也没用.

但这里p不传入肯定编译不通过的.
bool u_greater(const Object* _left, const Object* _right,const Object* p )
{
return (dist(_left->pos(), p) < dist(_right->pos(), p));
}
yjh1982 2003-08-30
  • 打赏
  • 举报
回复
bool u_greater(const Object* _left, const Object* _right)
{
return (dist(_left->pos(), p) < dist(_right->pos(), p));
}

改为
bool u_greater(const Object& _left, const Object& _right)
{
return (dist(_left.pos(), p) < dist(_right.pos(), p));
}

64,281

社区成员

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

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