使用STL的list排序,为何出问题

PageLee 2005-03-24 11:59:25
struct SatOrbit
{
float startTime;
float endTime;
std::list<Site*> *m_Site;
friend bool operator > ( SatOrbit&, SatOrbit&);
friend bool operator < ( SatOrbit&, SatOrbit&);
};
bool operator > (SatOrbit& _A, SatOrbit& _B)
{
return (_A.startTime > _B.startTime);
};

bool operator < (const SatOrbit& _A, SatOrbit& _B)
{
return (_A.startTime < _B.startTime);
};
struct Site
{
float x;
float y;

};

我要利用startTime的时间顺序来进行排序时

std::list<SatOrbit*> m_ListOrbit;//里面存好了数据
直接调用m_ListOrbit.sort()行吗?
我用的是VC6.0可是并没有按照startTime的时间顺序进行排序,为什么?初学STL有些不懂。望指定!看了好些贴子还是不明白。
...全文
635 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
somedummy 2005-03-26
  • 打赏
  • 举报
回复
VC++6的STL实现有问题……

手头没有VC++6,上次也遇到这个问题,最后改了vector解决的……
PageLee 2005-03-26
  • 打赏
  • 举报
回复
VC++6.0
somedummy 2005-03-26
  • 打赏
  • 举报
回复
……我说的是你用的是什么版本的VC++……
PageLee 2005-03-26
  • 打赏
  • 举报
回复
to somedummy(某人马甲·C/C++ 抢分王·废人认证)
你好,谢谢你的回复。
我用的是VC/MFC.在push_back所有数据后排序的。
我没有排序前list里面的顺序是插入元素后的顺序,
使用
greater<SatOrbit*> gr;
sort(gr);
后顺序刚好颠倒了一下。
MarkHuang 2005-03-26
  • 打赏
  • 举报
回复
楼上的马甲可否详细讲讲。
somedummy 2005-03-26
  • 打赏
  • 举报
回复
说说你用的是什么平台先……
useresu 2005-03-26
  • 打赏
  • 举报
回复
我也是初学STL,学习中,
如果是平台的问题,可以考虑装一个STLport啊,
是SCG STL的实现版本,应该就没问题了
lookhere 2005-03-26
  • 打赏
  • 举报
回复
发现自己看错了~~对不起~~

elem1 、 elem2 都是 class SatOrbit 指针~~

继续关注~~
lookhere 2005-03-26
  • 打赏
  • 举报
回复
int compare(class SatOrbit *elem1, class SatOrbit *elem2)
*elem1、*elem2 保存了两个list对象的地址,是一个整体,elem1->startTime 无法取出某一个元素的正确时间,所以会出错

不明白楼主在
std::list<SatOrbit*> m_ListOrbit;//里面存好了数据
一定要使用一个 SatOrbit* 作为元素对象,如果舍弃指针,只要重载结构体的 operator < () 就可以正常使用 m_ListOrbit.sort();了
somedummy 2005-03-26
  • 打赏
  • 举报
回复
这个……似乎m_ListOrbit不对吧?应该是获取一个iterator,deference以后再取地址的……
PageLee 2005-03-26
  • 打赏
  • 举报
回复
我改用vector,采用qsort排序,参照MSDN上的

typedef int (*compfn)(const void*, const void*);

int compare(class SatOrbit *elem1, class SatOrbit *elem2)
{
if ( elem1->startTime < elem2->startTime)
return -1;

else if (elem1->startTime > elem2->startTime)
return 1;

else
return 0;
}


qsort((void *)&m_ListOrbit,m_OrbitCount,sizeof(class SatOrbit), (compfn)compare );
用VC++6.0编译还是出错。
error C2440:'type cast' : cannot convert from '' to 'int (__cdecl *)(const void *,const void *)' None of the functions with this name in scope match the target type
这是什么错误?
bzCpp 2005-03-26
  • 打赏
  • 举报
回复
VC6的STL是比较惨不忍睹的……

复制的话只要不是有很奇怪的各种构造函数(主要是默认的和拷贝的),还有operator=,一般来说就可以使用qsort来排……
lookhere 2005-03-26
  • 打赏
  • 举报
回复
STL 的排序算法默认只使用 < ,所以如果没有特别需求,仅在结构定义中重载 operator < ()即可
vc 6.0没有试验过,在 C-Free中可以通过

像这样:
struct SatOrbit
{
float startTime;
float endTime;
std::list<Site*> *m_Site;
bool operator < ( SatOrbit& rhd)
return startTime < rhd.startTime;
};

然后在
list<SatOrbit> listSO_1;
...
listSO_1.sort();
...

可以正常调用STL算法了。
PageLee 2005-03-26
  • 打赏
  • 举报
回复
那在VC++6.0下,有没有解决我的那个list的排序的方法?
这样可以吗:
从list复制到vector,排序
然后从vector复制到list.
可以的话,这样复制?
somedummy 2005-03-26
  • 打赏
  • 举报
回复
不是……

我用了qsort……
PageLee 2005-03-26
  • 打赏
  • 举报
回复
如果改用vector时,排序是用通用算法的sort()?
MarkHuang 2005-03-25
  • 打赏
  • 举报
回复
mark
不懂
学习ing
somedummy 2005-03-25
  • 打赏
  • 举报
回复
这个……

list<T>::sort才是用来排序list的……

还有正确的T要求实现operator==才行,你只是实现了operator<和operator>(其中operator>不是必须实现的……)
PageLee 2005-03-25
  • 打赏
  • 举报
回复
to zhaozhencn(FlyingDonkey)
正如你所说的,我的m_ListOrbit 里面存放的是指针,而用&取的是地址,所以不能够比较,比较的是地址的大小。如果我采用你的那种写谓次词的方法,应该怎样使用这个谓词?
看了MSDN上是:
greater<...> gr;
sort(gr);
帮忙解决一下,问题解决了马上结题。
sailor_Song 2005-03-25
  • 打赏
  • 举报
回复
这是对stl的list不理解啊,看看源代码吧
加载更多回复(1)

64,632

社区成员

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

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