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さんの言うとおりですね。 このたびはみなさんに迷惑をかけてすみませんでした。 |