2017-01-22 5 views
1

はここに私のコードです:1mpl3m3ntベクトルスタック&出力保存&数え項目

私は現在、ユーザーがスタックにダンプされ、ソート入るが、私はありませんか/どこここから行くために行うすべてのものを持っています。私はカウント変数で解決しようとしましたが、私の解決策は適切ではありません(ユーザーが犬を2回入力すると「2匹の犬」が1回だけ出力されるはずです)。誰かがこれを解決する方法を知っているか知っている場合は、例を挙げてください。コメントで述べたように

+3

['std :: map '](http://en.cppreference.com/w/cpp/container/map)を使用するだけで十分です。そして、あなたの既存の入力ループには、あなたの 'endString'エントリのための1のカウントが含まれています。 – WhozCraig

+0

地図を使用する方法はありますが、代替ソリューションを検討していますか? – Prab

答えて

0

あなたはマップを使用する必要があります。しかし、あなたが別の答えを探しているなら、すべての要素について検索してください。 入力からすべての要素を読み取った後、ベクトルをループバックします。最初の要素を取得し、その値を格納し、それを削除し、他のsize-1要素をチェックして、それがこの要素と等しいかどうかを確認します。はいの場合は、カウンタを追加してベクトルから項目を削除します。 サイズが減少したことに注目してください。今度はサイズが0になるまで同じことをやり直してください。

1

使用のstd ::マップ:

std::map<std::string, unsigned int> countMap; 

while(enter!=endString){ 
    getline(cin,enter); 
    countMap[enter]++; // Operator `[]` enters a new key if not present and 
    // default initializes the value. 
    //, else fetches and increases the corresponding value 
} 

// coutMap[str] gives the number of times `str` entered. 
3

これを行うには複数の方法があります。

#include <iostream> 
#include <string> 
#include <map> 

int main() 
{ 
    std::map<std::string, unsigned int> mymap; 
    std::string s; 

    while (std::getline(std::cin, s) && !s.empty() && s != "END") 
     ++mymap[s]; 

    for (auto const& pr : mymap) 
     std::cout << pr.second << ':' << pr.first << '\n'; 
} 

それは

  • の仕組み各行が読み取られ、成功した場合(「END」に相当し、空ではなく、しないEOFない):最も簡単にはstd::mapの簡単な使用でありますマップ内のエントリを更新するために使用されます。
  • documentation for std::map::operator []には、必要なキーがマップに存在しない場合は追加され、マップされた値はの値で初期化されますです。 unsigned intの場合、初期値は0です。
  • そこから、返されたunsigned int参照にインクリメントが適用されます。これは、新しい要素の場合、既存の要素の値が1になります。これは単に以前の値をインクリメントします。
  • これは、ループが終了するまで続きます。

ループが終了すると、その結果が辞書順に報告され、その前にカウントが表示されます。

入力

one 
two 
three 
four 
three 
one 
one 
one 
two 
END 

出力

1:four 
4:one 
2:three 
2:two 

あなたは数に基づいて出力をソートしたい場合は、より多くの作業が行われる必要があるだろうが、それはにISN」難しいです。カウントが最初になるように反転マップからペアのセットは、文字列は二、その短い作品を作る:

#include <iostream> 
#include <string> 
#include <map> 
#include <set> 

int main() 
{ 
    std::map<std::string, unsigned int> mymap; 
    std::string s; 

    while (std::getline(std::cin, s) && !s.empty() && s != "END") 
     ++mymap[s]; 

    std::set<std::pair<unsigned int, std::string>> ms; 
    for (auto const& pr : mymap) 
     ms.insert(std::make_pair(pr.second, pr.first)); 

    for (auto const& pr : ms) 
     std::cout << pr.first << ':' << pr.second << '\n'; 
} 

例の実行は以下のように表示されます

入力

one 
two 
three 
four 
three 
one 
one 
one 
two 
END 

出力

1:four 
2:three 
2:two 
4:one 
+0

@danZsterこれを構築するには、C++ 11以降のコンパイラと標準ライブラリの実装が必要です(範囲指定のため)。 g ++またはclangを使用している場合、適切なスイッチは '-std = C++ 11'です。私はVisual C++のスイッチを知らないので、それがあなたが使っているものなら、それを調べなければならないでしょう。申し訳ありませんが、その場合です。いつものようにイテレータを使うのではなく、C++ 98に準拠する必要があります。 – WhozCraig

関連する問題