7-1頻度統計(30点)

単語の頻度統計

参考:
参照コードは、一般的な考え方は変わっていないいくつかの追加や変更を行って
、この問題はより困難を意味するものではありませんが、この問題は多くの構造のSTLの問題を解決するのに役立つので、コードを作ることができ、非常に簡単になります

タイトル

7-1頻度統計(30点)

単語の上位10%の英語のテキスト、すべての異なる単語の数に関する統計情報、および単語頻度最大の期間のためのプログラムを記述してください。
「ワード」の文字からなる単語のない80以上の連続した文字列を意味するが、15以上の長さだけ予約語15語の文字の前に撮影されます。大文字、小文字、数字、アンダースコアなどの法的な「単語文字」、他の文字は単語の区切りであると考えられています。
入力形式:
入力されたテキストは、最後のシンボル番号のいくつかの非空で、最後に与えられました。入力は、少なくとも10個の異なる単語があることを確認します。
出力フォーマット:
最初の行のテキスト出力のすべての異なる単語の数。「言葉」とは、「PAT」と「パットは」同じ単語であると考えられているように、英語で大文字と小文字を区別しないことに注意してください。
最大ワードの上位10%の単語の単語頻度出力フォーマットに従った順序ワード周波数、ワードの頻度を降順に続きます。縛られた場合は、Enterキーを押して辞書式出力をインクリメントします。
サンプル入力:
これはテストです。

言葉は「これは」最高周波数を持つ言葉です。

。同じ考えられているように、しかし、これ、これ、これ...#最後の中で異なっているthis_8 longlonglonglonee AS、カットLonglonglonglongword OFFする必要があります
。この行は無視されなければならない
単語があったものの:サンプル出力:(注。我々は、10%の出力(すなわち、最初の2つのワード23)ワードは、アルファベット順に、3行は出力されない)ビット直前のため4が、
23である
5:この
4:あります

考え

レコードのタイトル・ワード周波数は、その後、各単語が出現する回数を記録
「#」の終わりを示しているので、裁判官に逐語的に読み出す必要があるが、それを単語になることを?限り、各文字が行の文字列の後ろのアクセスを読んで
、あなたは、リスト、テーブルを構築することができ、各単語の出現があります

使用される構造と機能

(開始)とend()関数

実質的に線状のストレージクラスはすぐに最初の(通常添字0)と最後のデータを見つけるために、実際には、構造体のいくつかのタイプ(ベクターマップ)であろう。彼らは直接加算および減算することもできます
一般的に初期化や関数で使用されます

vector<pair<string ,int>> v(ma.begin(), ma.end());    //定义一个pair<string ,int>类型的数组,并且数组第一个数据为ma的第一个数据,最后一个数据为ma的最后一个数据
sort(v.begin(), v.end(), cmp);    //将v从v 的第一个到最后一个数据根据自定义的比较函数cmp进行分类。sort的自定义比较函数之后会说
//来自C++Reference的样例
int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33 (对前八个数排序)

  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33 (对前四个数排序)

対(ペア群)

ペアは、C ++テンプレート定義型である、あなたは同時に実際には、あなたがそれを達成するための構造を使用することができ、データの2種類を格納することができます

pair<string, int> a    //定义
a.firts="Hello World";    //对第一个数据进行操作
a.second="3";             //对第二个数据进行操作

地図

のは、C ++の参照の定義を見てみましょう

/*
Maps are associative containers that store elements formed by a combination of a key value and a mapped value, following a specific order.
In a map, the key values are generally used to sort and uniquely identify the elements, while the mapped values store the content associated to this key. 
The types of key and mapped value may differ, and are grouped together in member type value_type, which is a pair type combining both:
*/
 
typedef pair<const Key, T> value_type;

実際に、我々は、一連の内部に格納されているコンテナマップとして理解することができるキーと値のペア、すなわち、データの2つの異なるタイプ。
それは、「キーワード」と「キーワード値」(はい、とのようなペアリング)として理解することができます

ベクター(容器)

ベクターは、同じタイプの複数のデータを記憶するために、アレイの拡張版と見なすことができます。ここでは彼のソート機能の並べ替えを()を導入するための
以下の例で見ることができるC ++の参照から

 int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               //初始化为 32 71 12 45 26 80 53 33(myints的前八个放入vector)

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

()関数は、実際に自分の並べ替えを追加することができますが、それぞれがデフォルトに自分の言葉を追加した場合、ソート見ることができる非降順
私はそれを調整する方法に、独自の機能を追加したい場合は?
参照:[C ++]構造ソートするカスタムソート比較機能のCoMPソートアルゴリズムを使用する最も簡単なのベクトルである
第一カスタム戻り値比較機能がbool型の例が与えられ、

    bool comp(int a,int b){
        return a>b;
    }

    sort(v.begin(), v.end(), comp);

サイズ判定コンプ失う関数に比べてソート機能は、真のBを返します。<私はCOMPのように小さいから大規模まで、真Bを返し、関数として設定>デフォルトでは、ソート結果は、最終的な取得します従って大降順に小さくなる。実際に理解することができる:ソートした後、番号の前に、bが、私たちのカスタム関数の後ろの番号はaとbの間の関係を定義することである
私たちは、コードの例を見てみましょう

bool cmp(pair<string, int> a, pair <string, int> b) {
    bool result = false;
    if (a.second == b.second&&a.first < b.first) {
        result = true;
    }
    else if (a.second > b.second) {
        result = true;
    }
    return result;
}

sort(v.begin(), v.end(), cmp);

次いで、上記の式は、最後のデータ配列に最初のデータのそのベクトルを示すであろう。
データ・タイプが定義された比較関数に従って、ベクトルのペアであるため、第二の(単語出現)のペアが等しい場合、第1小(IF並置プレス辞書出力増加)の前に(ワード)。

コード

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

bool cmp(pair<string, int> a, pair <string, int> b);

int main() {
    char ch;
    string s;   //字符串用于记录一个单词
    map<string, int> ma;    //map记录词频,string代表的单词出现次数为int
    do {
        ch = getchar();
        //当读到的是合法字符(大小写字母、数字下划线)
        if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch >= '0'&&ch <= '9') || ch == '_') {
            if (s.size() <= 14) {   //当长度为14时再进行一次接入,长度为15就停止接入
                if (ch >= 'A'&&ch <= 'Z') {     //把大写换成小写
                    ch += 32;
                }
                s += ch;    //把单个字符ch接到字符串s后,string中有运算符重载所以加法表示接在后面
            }
        }
        else {      //当不是合法字符就表示这个词读取结束了,出现次数+1
            if (s.size() > 0) {
                ma[s]++;
            }
            s.clear();      //清空字符串以统计下一个单词
        }
        if (ch == '#') {    //读到#退出循环
            break;
        }
    } while (ch != '#');
    vector<pair<string ,int>> v(ma.begin(), ma.end());        //存储pair的一个数组(把vector理解为增强版的数组)
    sort(v.begin(), v.end(), cmp);
    cout << v.size() << endl;
    int cnt = (int)(ma.size()*0.1);
    for (int i = 0; i < cnt; i++) {
        cout << v[i].second << ":" << v[i].first << endl;
    }
    return 0;
}

//利用pair数据,每个pair数据都含有一个string数值和int数值
//
bool cmp(pair<string, int> a, pair <string, int> b) {
    bool result = false;
    if (a.second == b.second&&a.first < b.first) {
        result = true;
    }
    else if (a.second > b.second) {
        result = true;
    }
    return result;
}

おすすめ

転載: www.cnblogs.com/luoyang0515/p/10991972.html