1

文字列がstd::string str(s);あり、 s には次のような単語のリストがあります s="one two three one one two..."

そして、各単語の出現と、最大出現値を持つ最後の単語が必要です。

私は発生タイプを宣言しました:

typedef std::unordered_map<std::string> occurrences;
occurrences s1;

のコンテンツを に代入したいのですがss1どうすればいいですか?

その後、いくつかの間違いがある各単語の出現を取得するコードは次のとおりです。

for (std::unordered_map<std::string, int>::iterator it = s1.begin();
                                                    it != s1.end();
                                                    ++it)
    {
        std::cout << "word :" << it->first << "occured   " << it->second <<  "  times \n";
    }

ここで「one」、「two」という各単語の出現を取得する方法を教えてもらえますか?

リクエストに応じて、ここに元のコードを追加しています。

#include <string>
#include <iostream>
#include <unordered_map>

int main()
{
    typedef std::unordered_map<std::string,int> occurrences;
    occurrences s1;
    s1.insert(std::pair<std::string,int>("Hello",1));
    s1.insert(std::pair<std::string,int>("Hellos",2));

    for (std::unordered_map<std::string, int>::iterator it = s1.begin();it != s1.end();++it)
    {
        std::cout << "word :" << it->first << "occured   " << it->second <<  "  times \n";
    }

    return 0;
}

改善されたコード:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>

int main()
{
    typedef std::unordered_map<std::string,int> occurrences;
    occurrences s1;

    // the string we're splitting.
    std::string s = "one two three one one two";

    int maxcount=0,temp=0;  
    std::vector<std::string> vestring;

    // create an input string stream
    std::istringstream iss(std::move(s));

    // now simply extract strings until you reach end-of-file.
    while (iss >> s)
    {
        temp=++s1[s];
    if(temp>=maxcount)
    {
        maxcount=temp;
        vestring.push_back(s);
    }

    }
    for (occurrences::const_iterator it = s1.cbegin();it != s1.cend(); ++it)
        std::cout << it->first << " : " << it->second << std::endl;;

    return 0;
}
4

1 に答える 1

2

あなたは良いスタートを切っています。そして、カウンターに適切なクラスを使用しています。これは、ほとんどの人よりも優れています。必要なメカニズムは、空白を区切り文字として、より大きな文字列から部分文字列を解析する機能です。Astd::istringstream<>はこれをとてもうまくやるでしょう。

サンプル

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>

int main()
{
    typedef std::unordered_map<std::string,int> occurrences;
    occurrences s1;

    // the string we're splitting.
    std::string s = "one two two three one one two";

    // create an input string stream. we use std::move() to give
    //  the implementation the best chance at simply reassigning
    //  the buffer from the string to the stream
    std::istringstream iss(std::move(s));

    // this will hold all occurrances of the strings with
    //  maximum count. each time a new maximum is found
    //  we clear the vector and push the new leader in.
    std::vector<std::string> most;
    int max_count = 0;

    // now simply extract strings until you reach end-of-file.
    while (iss >> s)
    {
        int tmp = ++s1[s];
        if (tmp == max_count)
        {
            most.push_back(s);
        }
        else if (tmp > max_count)
        {
            max_count = tmp;
            most.clear();
            most.push_back(s);
        }
    }

    // send our map to stdout.
    for (occurrences::const_iterator it = s1.cbegin();it != s1.cend(); ++it)
        std::cout << it->first << " : " << it->second << std::endl;;

    // send the strings with max_count to stdout
    std::cout << std::endl << "Maximum Occurrences" << std::endl;
    for (std::vector<std::string>::const_iterator it = most.cbegin(); it != most.cend(); ++it)
        std::cout << *it << std::endl;

    return 0;
}

出力

three : 1
two : 3
one : 3

Maximum Occurrences
one
two

これで始められるはずです。最大数を見つけることは問題ありません (ヒント: 各挿入の後、マップには処理された単語の現在の数が含まれます)。

これを行うにはさらに効率的な方法がありますが、現在行っていることにはおそらく十分すぎるほどです。

于 2013-08-23T06:57:16.507 に答える