はここに私のコードです:1mpl3m3ntベクトルスタック&出力保存&数え項目
私は現在、ユーザーがスタックにダンプされ、ソート入るが、私はありませんか/どこここから行くために行うすべてのものを持っています。私はカウント変数で解決しようとしましたが、私の解決策は適切ではありません(ユーザーが犬を2回入力すると「2匹の犬」が1回だけ出力されるはずです)。誰かがこれを解決する方法を知っているか知っている場合は、例を挙げてください。コメントで述べたように
はここに私のコードです:1mpl3m3ntベクトルスタック&出力保存&数え項目
私は現在、ユーザーがスタックにダンプされ、ソート入るが、私はありませんか/どこここから行くために行うすべてのものを持っています。私はカウント変数で解決しようとしましたが、私の解決策は適切ではありません(ユーザーが犬を2回入力すると「2匹の犬」が1回だけ出力されるはずです)。誰かがこれを解決する方法を知っているか知っている場合は、例を挙げてください。コメントで述べたように
あなたはマップを使用する必要があります。しかし、あなたが別の答えを探しているなら、すべての要素について検索してください。 入力からすべての要素を読み取った後、ベクトルをループバックします。最初の要素を取得し、その値を格納し、それを削除し、他のsize-1要素をチェックして、それがこの要素と等しいかどうかを確認します。はいの場合は、カウンタを追加してベクトルから項目を削除します。 サイズが減少したことに注目してください。今度はサイズが0になるまで同じことをやり直してください。
使用の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.
これを行うには複数の方法があります。
#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';
}
それは
std::map
の簡単な使用でありますマップ内のエントリを更新するために使用されます。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
@danZsterこれを構築するには、C++ 11以降のコンパイラと標準ライブラリの実装が必要です(範囲指定のため)。 g ++またはclangを使用している場合、適切なスイッチは '-std = C++ 11'です。私はVisual C++のスイッチを知らないので、それがあなたが使っているものなら、それを調べなければならないでしょう。申し訳ありませんが、その場合です。いつものようにイテレータを使うのではなく、C++ 98に準拠する必要があります。 – WhozCraig
['std :: map'](http://en.cppreference.com/w/cpp/container/map)を使用するだけで十分です。そして、あなたの既存の入力ループには、あなたの 'endString'エントリのための1のカウントが含まれています。 –
WhozCraig
地図を使用する方法はありますが、代替ソリューションを検討していますか? – Prab