STL LIST::Sort问题,请高手看代码解决问题,多谢!

VCILOVE 2009-08-06 10:45:18
STL LIST::Sort问题,请高手看代码解决问题,多谢!
运行期望排序后得到:
20 0X18
10 0X19
30 0X20

可是运行后得到的确是:
30 0X20
20 0X18
10 0X19


#include "StdAfx.h"
#include <list>
using namespace std;

typedef struct subscribeitem
{
int cig_quantity;
char cig_name; //以此作为排序

public:
bool operator > (const subscribeitem& b1) const
{
return memcmp(&cig_name,&(b1.cig_name),1)>0;
}
bool operator < (const subscribeitem& b1) const
{
return memcmp(&cig_name,&(b1.cig_name),1)<0;
}
}Subitem;

void main()
{
//创建第一个list
list <Subitem*> ::iterator iter;
list <Subitem*> m_plist;

Subitem item1;
item1.cig_quantity=10;
item1.cig_name=0x19;
m_plist.push_back(&item1);

Subitem item2;
item2.cig_quantity=20;
item2.cig_name=0x18;
m_plist.push_back(&item2);

Subitem item3;
item3.cig_quantity=30;
item3.cig_name=0x20;
m_plist.push_back(&item3);
//打印结果
printf("打印结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x\n",(*iter)->cig_quantity,(*iter)->cig_name);
}
printf("\n");

m_plist.sort();
//打印排序后结果
printf("打印排序后结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x\n",(*iter)->cig_quantity,(*iter)->cig_name);
}
printf("\n");

return;
}

请各位帮忙解答啊,已经调试晕了:(
...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
VCILOVE 2009-08-08
  • 打赏
  • 举报
回复
楼上的兄弟,你果然很强,多谢啊,呵呵

非常感谢:)
  • 打赏
  • 举报
回复
main()函数里改一下就行。
void main()
{
//创建第一个list
list <Subitem> ::iterator iter;
list <Subitem> m_plist;

Subitem item1;
item1.cig_quantity=10;
item1.cig_name=0x19;
m_plist.push_back(item1);

Subitem item2;
item2.cig_quantity=20;
item2.cig_name=0x18;
m_plist.push_back(item2);

Subitem item3;
item3.cig_quantity=30;
item3.cig_name=0x20;
m_plist.push_back(item3);
//打印结果
printf("打印结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x\n",(*iter).cig_quantity,(*iter).cig_name);
}
printf("\n");

m_plist.sort();
//打印排序后结果
printf("打印排序后结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x\n",(*iter).cig_quantity,(*iter).cig_name);
}
printf("\n");

return;
}
FirryHere 2009-08-07
  • 打赏
  • 举报
回复
好像你操作符重载了,但是,你的容器里面放的是指针,操作符,只对对象起作用,没有对 对象指针起作用啊。
pengzhixi 2009-08-07
  • 打赏
  • 举报
回复
建议 将list里面的东西拷贝到vector里面,排序后再拷回去
yshuise 2009-08-07
  • 打赏
  • 举报
回复
指针比较的时候无法调用:operator<
只有这个对象才能调用operator<(这个类的成员函数)
baihacker 2009-08-07
  • 打赏
  • 举报
回复

//因为你的list里面装的是指针,当然就按指针的大小排序了,而不是指向的东西中的operator <排序
//我输出了一下指针本身的值

#include <list>
#include <cstdio>
#include <cstring>
using namespace std;

typedef struct subscribeitem
{
int cig_quantity;
char cig_name; //以此作为排序

public:
bool operator > (const subscribeitem& b1) const
{
return memcmp(&cig_name,&(b1.cig_name),1)>0;
}
bool operator < (const subscribeitem& b1) const
{
return memcmp(&cig_name,&(b1.cig_name),1) <0;
}
}Subitem;

int main()
{
//创建第一个list
list <Subitem*> ::iterator iter;
list <Subitem*> m_plist;

Subitem item1;
item1.cig_quantity=10;
item1.cig_name=0x19;
m_plist.push_back(&item1);

Subitem item2;
item2.cig_quantity=20;
item2.cig_name=0x18;
m_plist.push_back(&item2);

Subitem item3;
item3.cig_quantity=30;
item3.cig_name=0x20;
m_plist.push_back(&item3);
//打印结果
printf("打印结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x\n",(*iter)->cig_quantity,(*iter)->cig_name);
}
printf("\n");

m_plist.sort();
//打印排序后结果
printf("打印排序后结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x %p\n",(*iter)->cig_quantity,(*iter)->cig_name, *iter);
}
printf("\n");

return 0;
}
taodm 2009-08-07
  • 打赏
  • 举报
回复
楼主既然用的VC6这个垃圾货,就只有导入vector,再用std::sort使用functor参数排序后,再导回list了。
VCILOVE 2009-08-07
  • 打赏
  • 举报
回复
谢谢楼上的兄弟,这样确实可以,但是要求LIST中存储的东西越少越好,
所以,只存贮指针,但是为什么指针就不对呢,谢谢!
baihacker 2009-08-07
  • 打赏
  • 举报
回复
#include <list> 
#include <cstdio>
#include <cstring>
using namespace std;

typedef struct subscribeitem
{
int cig_quantity;
char cig_name; //以此作为排序

public:
bool operator > (const subscribeitem& b1) const
{
return memcmp(&cig_name,&(b1.cig_name),1)>0;
}
bool operator < (const subscribeitem& b1) const
{
return memcmp(&cig_name,&(b1.cig_name),1) <0;
}
}Subitem;

int cmp(Subitem* l, Subitem* r)
{
return *l < *r;
}
int main()
{
//创建第一个list
list <Subitem*> ::iterator iter;
list <Subitem*> m_plist;

Subitem item1;
item1.cig_quantity=10;
item1.cig_name=0x19;
m_plist.push_back(&item1);

Subitem item2;
item2.cig_quantity=20;
item2.cig_name=0x18;
m_plist.push_back(&item2);

Subitem item3;
item3.cig_quantity=30;
item3.cig_name=0x20;
m_plist.push_back(&item3);
//打印结果
printf("打印结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x\n",(*iter)->cig_quantity,(*iter)->cig_name);
}
printf("\n");

m_plist.sort(cmp);
//打印排序后结果
printf("打印排序后结果:\n");
for(iter=m_plist.begin();iter!=m_plist.end();iter++)
{
printf("Quantity is %02d, Name is 0X%02x %p\n",(*iter)->cig_quantity,(*iter)->cig_name, *iter);
}
printf("\n");

return 0;
}
VCILOVE 2009-08-07
  • 打赏
  • 举报
回复
多谢楼上的众位兄弟解答,看来只好再用存储实例的方式了,
真的没有办法解决了吗,
另外,我的重载函数不能下断点,是不是也是这样原因啊,多谢

如果没有其他的答案,明天就结贴了

64,648

社区成员

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

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