C言語関係掲示板

過去ログ

No.1347 1行の文字数を少ない順に並び替え

[戻る] [ホームページ]
No.18210

1行の文字数を少ない順に並び替え
投稿者---うったん(2004/11/17 22:57:43)


下のプログラムはabc順に並び替えるプログラムなんですが、標準入力で1行の文字数を出力し、行は最大80文字で80文字以上の場合は先頭の80文字のみ、さらに空行は出力しないというプログラムを作りたいのですが、標準入力をし行ごとに読み込むところまでは出来ました。
しかし、文字数で並び替えをするところが出来なくて困っています。
クラスなどを使いsortを使えばいいと思うのですが・・・

#include <string>
#include <iostream>
#include <list>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::list;
main(){
  list<string> l;
  list<string>::iterator i;
  char buffer[81];
  while(!cin.eof()){
    cin.getline(buffer,sizeof(buffer));
    l.insert(l.end(),buffer);
    while((!cin.eof())&&cin.fail()){
      cin.clear();
      cin.ignore(80,'\n');
    }
  }
  l.sort();
  while(!l.empty()){
    i=l.begin();
    cout << *i << endl;
    l.erase(i);
  }
}



No.18212

Re:1行の文字数を少ない順に並び替え
投稿者---monkey(2004/11/17 23:33:00)


> 文字数で並び替えをする

#include <string>
#include <iostream>
#include <list>
#include <functional>

class shorter : public std::binary_function< std::string, std::string, bool >
{
public:
    bool operator()( const std::string& lhs, const std::string& rhs ) const
    {
        return lhs.size() < rhs.size();
    }
};

int main()
{
    std::list< std::string > l;

    ...

    // 文字数の昇順で並べ替え
    l.sort( shorter() );

    ...

}



No.18213

Re:1行の文字数を少ない順に並び替え
投稿者---monkey(2004/11/18 00:09:47)


// ご参考

#include <string>
#include <list>
#include <iostream>
#include <functional>
#include <algorithm>

class shorter : public std::binary_function< std::string, std::string, bool >
{
public:
    bool operator()( const std::string& lhs, const std::string& rhs ) const
    {
        return lhs.size() < rhs.size();
    }
};

int main()
{
    const std::string::size_type MAX_SIZE = 80;

    std::list< std::string > str_list;
    for( std::string s; std::getline( std::cin, s ); ){
        if( !s.empty() ){
            str_list.push_back( s.substr( 0, MAX_SIZE ) );
        }
    }

    str_list.sort();
    std::cout << "辞書順" << std::endl;
    std::copy( str_list.begin(), str_list.end(), std::ostream_iterator< std::string >( std::cout, "\n" ) );

    str_list.sort( shorter() );
    std::cout << "文字数順" << std::endl;
    std::copy( str_list.begin(), str_list.end(), std::ostream_iterator< std::string >( std::cout, "\n" ) );
}



No.18224

Re:1行の文字数を少ない順に並び替え
投稿者---επιστημη(2004/11/18 10:38:19)


>クラスなどを使いsortを使えばいいと思うのですが・・・

list<T>::iteratorはrandom-accessではないので、
sortの引数に与えることができません。

戦略はmonkeyさんのサンプル通り。
文字列集合にvector<string>を使うなら、

sort(x.begin(), x.end(), 大小判定オブジェクト());

が使えます。



No.18312

Re:追加で質問、いいですか?
投稿者---ぽこ(2004/11/23 12:51:59)


マルチポストもいい加減止めませんか?





No.18313

Re:追加で質問、いいですか?
投稿者---REE(2004/11/23 12:52:45)


>『標準入力からテキストファイルを読み込み』をする場合、どのようにすればいいですか?

リダイレクトします。

# 意味が分からない場合は調べましょう。


No.18321

Re:追加で質問、いいですか?
投稿者---うったん(2004/11/23 19:11:05)


>>『標準入力からテキストファイルを読み込み』をする場合、どのようにすればいいですか?

このような質問はしてないんですが・・・。
あ、遅くなりましたがmonkeyさん、επιστημηさん私の質問に答えてくれてありがとうございました。


No.18322

Re:追加で質問、いいですか?
投稿者---ぽこ(2004/11/23 20:52:39)


>このような質問はしてないんですが・・・。

どうやら、名前を騙ったようですね。。
スレ主の方のうったんさん、気分を害してしまい申し訳ありません。



No.18323

Re:追加で質問、いいですか?
投稿者---monkey(2004/11/23 21:06:02)


>>このような質問はしてないんですが・・・。
>
>どうやら、名前を騙ったようですね。。

騙った者が悪いのには違いありませんが、'こちら'のスレッドを放置しておいたうったんさんにも、'スキ'があったかも知れませんね。
玄関の戸締まりと同様に、悪意ある者につけこまれないような振る舞いも大事です。

で、本題ですが、せっかくですから、良く似た問題を扱った'あちら'も参考にして下さい。
# 偽マルチポストの有効利用^^;

http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200411/04110056.txt
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200411/04110061.txt


No.18326

Re:追加で質問、いいですか?
投稿者---うったん(2004/11/23 21:54:04)


こちらの方に落ち度があったのは、monkeyさんの言うとおりですね。
このたびはみなさんに迷惑をかけてすみませんでした。