ページ 11

単語の長さ順にソート

Posted: 2010年4月18日(日) 19:42
by kos-mos
今回も学校の宿題で、以下の通りのものです。
テキストファイルを読みvector配列に格納した各単語を、単語の長さ順にソートするプログラムを作成せよ。

下にも未解決のものがありますが、かなり挫折気味なのでこちらを考えることにしました。(下のがわかる方はご助力お願いします)

ここまで作ったのですが、テキストファイルを読みvector配列に格納した各単語を、単語の長さ順にソートするところがどういたらいいのかわかりません。どうかおねがいします。
#include <vector>
#include <algorithm>
#include <fstream>
#include <string> 
#include <iostream>
using namespace std;

void main(){
    ifstream inFile;    //入力ファイル
    string word;        //単語
    vector <string> array; //

    //入力ファイルを開く
    inFile.open("test.txt");
    
    //ファイル末尾でなければ、以下を繰り返す
    while(!inFile.eof()){

        //ファイルから単語を読む
        inFile >> word;

        //vectorの末尾へ格納する
        array.push_back(word);
    }
    //ファイルを閉じる
    inFile.close();

    //vector配列に格納した全要素を辞書順にソーティング
    sort(array.begin(),array.end());

    //vectorの最初から最後まで要素の出力を繰り返す
    for( unsigned i = 0; i < array.size(); i++){
        cout << array << endl;
    }
}
画像

Re:単語の長さ順にソート

Posted: 2010年4月18日(日) 21:04
by Justy
 std::sortには3番目の引数を受け付けるバージョンがあります。

カメログ(2005-09-15)
http://kmdsbng.railsplayground.net/diary/?date=20050915



# ところで何故 void main? 画像"編集済み]

Re:単語の長さ順にソート

Posted: 2010年4月18日(日) 21:51
by kos-mos
この辺りは詳しく習っていないので、読んでもイマイチわかりません。

つまりどうしたらいいのでしょうか?

void main ではダメなのでしょうか?

Re:単語の長さ順にソート

Posted: 2010年4月18日(日) 22:23
by mosukun
こんにちは。

この場合、sort()にファンクターを使う場合は、

class Judge{
public:
bool operator () ( string& a , string& b ){ return a.length() > b.length();}
};

(これは昇順の場合です。降順にソートしたい時は a.length() > b.length() の部分を
 a.length() < b.length() としてください)

と、クラス宣言をしてから

sort( array.begin() , array.end() );

の部分を

sort( array.begin() , array.end() , Judge() );

に変更します。

Re:単語の長さ順にソート

Posted: 2010年4月18日(日) 22:36
by mosukun
ごめんなさい。

昇順、降順のくだりは逆でした。
上に記した a.length() > b.length() では、降順にソートされます。

したがって、昇順にソートしたい場合は a.length() < b.length()となります。

失礼しました。

Re:単語の長さ順にソート

Posted: 2010年4月18日(日) 22:51
by Justy
>ソート
 mosukunさんの方法でもいいですし、先のページにある「関数ポインタを使用するサンプル」のように
普通の関数として比較関数を用意してもいいです。
 で、その関数を std::sortの第三引数に指定すればOKです。


>void main ではダメなのでしょうか?
 C++では main関数の戻り値は intと決められています。
 もし参考資料などで戻り値が voidになっているようでしたら、全て intに直しておいた方が
いいかと思います。
(このレベルで間違っていると、他のところも間違っていそうで怖いですが)。

Re:単語の長さ順にソート

Posted: 2010年4月18日(日) 22:52
by kos-mos
無事なりました^^ノシ
本当にありがとうございましたm(__)m