请高手指教-关于list的sort()问题

thinkerhj 2003-01-02 10:18:15
#include <iostream>
#include <list>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{

list<char*> li;
li.push_front("20021212");
li.push_front("20020812");
li.push_front("20020912");
li.push_front("20021213");

li.sort();

list<char*>::iterator p = li.begin();

while(p != li.end())
{
cout<<((char*)*p)<<endl;
p++;
}
getchar();
return 0;
}
请帮我看看为什么不能排序?
...全文
104 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
北极猩猩 2003-01-18
这样吧,push_front(string("20021212"));
回复
fangrk 2003-01-17
我来拿点分数吧!

std::sort(iterator1,iterator2,compare)中间,iterator1和iterator2需要是random iterator(随机指针),仅仅是biradical iterator(双向指针)是不够的。
像string,vector等都支持随机指针,而list是双向指针(例如不能有first+=n),所以对list的排序需要这样调用:list.sort(...),而不能这样写:sort(list.begin(),list.end(),...)。

缺省的比较参数是<,在你的例子中间采用了const char*,需要定义

class compareString
{
bool operator(const char* rhs ,const char* lhs)
{
return strcmp(rhs,lhs) == 0;
}
}

//sort(li.begin() ,li.end() ,compareString());错误
li.sort(compareString());

如果采用std::string作为list的内容(std::list<std::string> li;),那么li.sort()就可以了。
回复
thinkerhj 2003-01-14
同意 topikachu(皮皮)
这样写,比较的是char *的顺序(也就是两个指针的地址先后顺序)
to: vlmf(小兵)
能不能给出你的代码、我这里调试不能通过。

回复
aliucc 2003-01-05
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
using namespace std;

int main()
{

list<string> li;
li.push_front("20021212");
li.push_front("20020812");
li.push_front("20020912");
li.push_front("20021213");

li.sort();

list<string>::iterator p = li.begin();

while(p != li.end())
{
cout<<*p<<endl;
p++;
}
return 0;
}



以上程序在VC++6.0下调试通过。
回复
topikachu 2003-01-03
re: vlmf(小兵)
既然是要排续,就要有大小(先后)顺序
所以oprator()返回的应该类似 < 比较的情况
回复
vlmf 2003-01-02
bool operator()(const char* rhs ,const char* lhs)
回复
vlmf 2003-01-02

class compareString
{
bool operator(const char* rhs ,const char* lhs)
{
return strcmp(rhs,lhs) == 0;
}
}

sort(li.begin() ,li.end() ,compareString());
回复
xiaonian_3654 2003-01-02
#include <iostream>
#include <list>
#include <string>
#include <stdio.h>
using namespace std;

int main(int argc, char* argv[])
{

list<string> li;
li.push_front("20021212");
li.push_front("20020812");
li.push_front("20020912");
li.push_front("20021213");

li.sort();

list<string>::iterator p = li.begin();

while(p != li.end())
{
cout<<*p<<endl;
p++;
}
getchar();
return 0;
}
回复
topikachu 2003-01-02
尽量用些高级的东西吧,比如string类型,而不是char*.
只要改成list<string> li;那么你就自动有按照字符顺序的功能了:)
回复
topikachu 2003-01-02
你要按照什么排续?
数字顺序?
字符的比较顺序?
你这样写,比较的是char *的顺序(也就是两个指针的地址先后顺序)
回复
发动态
发帖子
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
社区公告
暂无公告