注册 登录
编程论坛 C++教室

向量中各元素的长度?

unicorn 发布于 2007-03-24 23:26, 1482 次点击

最近复习STL ,练习一个简单题目"找出一句话(单词用空格隔开)中最长的单词和最短的单词"

我先把单词都存到一个string向量中,但不知道是否有有方法可以直接找出最大或最小,感觉我直接写的有些麻烦

希望指点一下 ,红色部分如何更简捷些就能求出向量中各元素的长度

程序代码:


#include<iostream>
#include<string>
#include<vector>


using namespace std;


int main()
{
int max=0,min=10;
string sen(\"i have got a beautiful dream\");//随便一句话(空格隔开各个单词)
string::size_type pos=0,pp=0;
vector<string> word,wmax,wmin;
vector<string>::iterator p;


while((pos=sen.find_first_of(\" \",pos))!=string::npos)//通过空格分解单词
{
  word.push_back(sen.substr(pp,pos-pp));//把单词存到容器中
  pp=++pos;
}
pos=sen.rfind(\" \")+1;
    word.push_back(sen.substr(pos,sen.size()-pos)); //把最有一个单词存到容器中

p=word.begin();
while(p!=word.end())
{
  max=(*p).size()>=max?(*p).size():max;
  min=(*p).size()<=min?(*p).size():min;
  ++p;
}


for(p=word.begin();p!=word.end();++p)
{
  if((*p).size()==max)
   wmax.push_back(*p);
  else if((*p).size()==min)
   wmin.push_back(*p);
}
//我写的好麻烦


p=wmax.begin();//简单的分别输出最长和最短的单词(s)
cout<<\"the longest word:\";
while(cout<<\" \",p!=wmax.end()) cout<<*p++;
cout<<\"\nlength is \"<<max<<endl;
    p=wmin.begin();
cout<<\"the shortest word:\";
while(cout<<\" \",p!=wmin.end()) cout<<*p++;
cout<<\"\nlength is \"<<min<<endl;
return 0;


}

6 回复
#2
song42007-03-25 08:03
你这个就相当于冒泡排法
效率算是最低的
建议你用SHELL排序与直接插入排序组合一下
或者用堆排序等
#3
dlcdavid2007-03-26 09:44
用stringstream在存入vector的时候就把最大最小的找出来
#4
dlcdavid2007-03-26 09:46

getline(ss,word,' ')可以忽略空格

#5
song42007-03-26 12:12

一般要是要效率
最好自己写

#6
corrupt2007-03-26 13:16
用快速排序
#7
wfpb2007-03-26 14:45

不需要先存进数组在比较长短吧,直接就可比较啊!

void LSString(string src,string &LStr,string &SStr)
{
    int llen=0,slen=0;
    int old=0,origin=0;
    while(origin!=src.length())
    {
        origin=src.find(' ',old);
        if(origin==-1)
            origin=src.length();
        if(llen<origin-old-1)
        {
            LStr.assign(src.begin()+old,src.begin()+origin);
            slen=llen;
            llen=origin-old-1;
            if(slen==0)
                slen=llen;
        }
        else if(slen>origin-old-1)
        {
            SStr.assign(src.begin()+old,src.begin()+origin);
            slen=origin-old-1;
        }
        old=origin+1;
    }
}

1