-1

このアプローチの何が問題なのですか

#include<algorithm>
#include<iomanip>
#include<ios>
#include<iostream>
#include<string>
#include<vector>

using std::cin;using std::cout;
using std::endl;
using std::setprecision;
using std::string;
using std::streamsize;
using std::sort;
using std::vector;

int main(){

    string zz;
    typedef vector<string> vs;

    vs input,distinct;vector<int> count;
    cout<<"Enter the words";
    while(cin>>zz){
        input.push_back(zz);
    }

    if(input.size()==0){
        cout<<"Enter atleast a single    word";
        return 1;
    }

    int i=0,j=0;
    sort(input.begin(),input.end());
    while(i!=input.size()){
        int count2=0;
        for(j=i;j<input.size();j++)
        {
            if(input[j]==input[j+1])
            {
                count2++;
            }else{ 
                break;
            }
        }
        distinct.push_back(input[i]);
        count.push_back(count2);
        i+=count2;continue;
        i++;
    }

    for(i=0;i<distinct.size();i++)
    {
        cout<<distinct[i]<<"\t           time"<<count[i]<<"\n";
    }

    return 0;
}

私はubuntu 12.10を使用していますgcc4.7

このタスクは、与えられた入力の個別の数を数えて表示します。プログラムは入力を要求し、ファイルの終わりの後でも入力の取得を停止しません。つまり、ctrl + d

4

1 に答える 1

3

問題は読み取りループではありません。で無限ループに陥ります

while(i!=input.size()){

最終条件と、変更される行について慎重に検討してくださいi

    i+=count2;continue;
    i++;

いつかi++処刑される?正確に等しいでしょiうか?繰り返し言葉がある場合は?ない場合は?input.size()

.

.

.

わかりました、それについて考えましたか?そのループをこれに置き換えました。コメントは次のように説明する必要があります。

while(i < input.size())
{
    // Store current string
    distinct.push_back(input[i]);

    // Skip same strings
    int j = i;
    while ( j < input.size() // Don't go too far
            && input[i] == input[j] ) // And only while duplicates
        ++j;

    // Store a count of how many we skipped
    count.push_back(j-i);

    // Move to the next *non-identical* string
    i=j;
}

もちろん、標準ライブラリ アルゴリズムを使用してこれを行うためのより優れた方法はありますが、これは簡単な教育的な演習であると思います。

私が書いた方法が&&重要であることにも注意してください!逆に、最後の文字列を末尾の文字列と比較しようとします。

于 2013-07-11T09:48:49.833 に答える