標準入力からテキストファイルを読み込み、行を短い順に出力しなさい。但し、行は最大 80 文字とし、 80 文字以上の行は先頭 80 文字だけの行として取扱い出力し、空行は出力しないで下さい。また、同じ長さの行は入力した順番に出しなさい。
この問題がどうしても分かりません。教えてください(><;)
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+18210
コレっすか?
> コレっすか?
'コレ'に回答したmonkeyです^^
あちらとほぼ同じですが、「同じ長さの行は入力した順番」という要件が加わったので、文字列を格納するのには"vector"を使い、ソートには"stable_sort"を使うのが良いでしょう。
また、「空行は出力しない」ということは、「空行も格納はする」と解釈した方が良いのかも知れません。
80字を超える行について、ソートのときには一律80字として扱うのか、あるいは、元の文字数のままソートして出力だけ80字にするのか、はっきりしませんが、とりあえず前者だと解釈しました。
というわけで、新バージョンを晒します:
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
template < typename Sequence >
class less_length : public std::binary_function< Sequence, Sequence, bool >
{
public:
bool operator()( const Sequence& lhs, const Sequence& rhs ) const
{
return lhs.size() < rhs.size();
}
};
int main()
{
std::vector< std::string > data;
for( std::string line; std::getline( std::cin, line ); data.push_back( line.substr( 0, 80 ) ) ){
;
}
std::stable_sort( data.begin(), data.end(), less_length< std::string >() );
for( std::vector< std::string >::const_iterator it = data.begin(); it != data.end(); ++it ){
if( !it->empty() ){
std::cout << *it << std::endl;
}
}
}
お二人とも解答ありがとうございます。
本当に助かりました。残りは自力でがんばってみます☆(^▽^)/
ツイート | ![]() |