关于STL中sort的一个小小用法的疑惑,大家都来看看!!!

那个天真的人 2008-08-02 04:12:16
大家先看个题目:
编写一个程序,读入几行大写文本,并产生文本词语索引,即不同的单词列表.把以A开头的单词存储在一个链表中,把以B开头的单词存储在另一个链表中,以此类推.
在读完所有的文本行之后,对每个列表进行排序,然后按字母顺序打印这些单词.
我写的程序如下(我用的是DEV_CPP,编译正确,结果也是正确的,用VC不行,但这不是我今天想问的主要问题,想问的问题在最后面)

#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <algorithm>
using namespace std;
bool StringLessThan(string a,string b)
{
return a>b;
}
//bool StringMoreThan( const list<string> & s1, const list<string> & s2) //改后增加的函数
//{
// return s1.front()>s2.front();
//}
int main()
{
vector< list<string> > wordsort(26);//定义26个空的链
string word;
cout<<"enter some words,when it is #,stop.\n";
cin>>word;
int pos;
while(word!="#") //把A的单词放入链wordsort[0]中,把B的单词放入链wordsort[1]中,依此类推
{
pos=word[0]-'A';
wordsort[pos].push_back(word);
cin>>word;
}
for(int i=0; i<26; i++) //该循环主要是对每条链中的单词进行从大到小的排序
if(!wordsort[i].empty())
wordsort[i].sort(StringLessThan);
//sort(wordsort.begin(),wordsort.end(),StringMoreThan); //该行为改后增加的一个函数调用
for(int i=0; i<26; i++)
if(!wordsort[i].empty())
{
for(list<string>::iterator it=wordsort[i].begin();
it!=wordsort[i].end(); it++)
cout<<*it<<" ";
cout<<endl;
}
getchar();
getchar();
return 0;
}

运行示例:
input:
enter some words,when it is #,stop.
DA JIA HAO A
WO SHI CHEN XI DE ZHAO YAN
#

output:
A
CHEN
DE DA
HAO
JIA
SHI
WO
XI
YAN
ZHAO

现在,如果我想input的内容不变,但是output的顺序倒过来,也就是
output:
ZHAO
YAN
XI
WO
SHI
JIA
HAO
DE DA
CHEN
A

于是我改了一下程序,也就是添加了注释中的内容,这样子编译没有错,但是结果却出错了,各位大侠帮忙看下,不胜感激!!!
...全文
131 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanne2 2008-08-02
  • 打赏
  • 举报
回复
代码好乱啊。。。
不过你可以试试set容器很好使的哦~~~
那个天真的人 2008-08-02
  • 打赏
  • 举报
回复
我试过了,3楼说的对哦,谢谢啦,我还以为那个算法哪里出问题了,原来是空链抛出的异常.
至于你们说的为什么想逆着输出,呵呵,那是一时的想法,想试试一下那个sort从大排到小而已,没别的多大用意.
jieao111 2008-08-02
  • 打赏
  • 举报
回复
不知道你为什么要排序,要是想反向输出时,可以
      for(int i=25; i>=0; --i) 
if(!wordsort[i].empty())
{
for(list <string>::iterator it=wordsort[i].begin();
it!=wordsort[i].end(); it++)
cout <<*it <<" ";
cout <<endl;
}
jieao111 2008-08-02
  • 打赏
  • 举报
回复
错误在这:

你的wordsort里的东西一共26个。。可是有的内容为空。

在sort的时候,它是每个元素都比较的,所以当存在一个空的list比较时,就会抛出异常。

你可以把试着存储26个list,会发现不会出错了。
lbc122 2008-08-02
  • 打赏
  • 举报
回复
rebegin,reend
jieao111 2008-08-02
  • 打赏
  • 举报
回复
要想反着输出,用个反向的迭代器就行了

64,282

社区成员

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

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