2017-04-10 6 views
1

私の目標は、ベクトルの重複をチェックし、それらの重複カウントでポストすることです。例:ベクトルの重複をチェックしてそれらを数えるC++

vector<string> vec{"words", "words", "are", "fun", "fun", "fun"}; 
// words - 2 
// fun - 3 

私は素敵な解決策を見つけたが、私は知らないカウンタを印刷するすべての可能な方法があります:

vector<string> vec{"words", "words", "are", "fun", "fun", "fun"}; 
sort(vec.begin(), vec.end()); 
set<string> uvec(vec.begin(), vec.end()); 
list<string> output; 

set_difference(vec.begin(), vec.end(), 
       uvec.begin(), uvec.end(), 
       back_inserter(output)); 

for (list<string>::iterator i = output.begin(); i != output.end(); ++i) 
    cout << *i << endl; 
+0

どのコンパイラを使用していますか(どのバージョンとどちらのバージョン)ですか? – Rerito

答えて

3

あなたは、単に単語の数をカウントmapを保つことができます。

vector<string> vec{"words", "words", "are", "fun", "fun", "fun"}; 
map<string, int> words; 
for(const auto& x : vec) ++(words[x]); 

for(const auto& [k, v] : words) 
    if(v > 1) cout << k << " - " << v << "\n"; 

live wandbox example


私はC++ 17機能を使用しています注[k, v]wordsのペアをdestructureする"構造化されたバインディング"と呼ばれます。 C++ 17コンパイラがない場合はconst auto& p : wordsを使用し、p.firstp.secondのペアメンバーにアクセスできます。

+0

私は今、野生のC++ 17を見ることができないことを忘れていました: ') –

+0

second for forループでconstにエラーがあります。私は何かを含めるべきですか? "表現が期待される"と言っています。 – TeodorKolev

+0

@TeodorKolev:私は "構造化バインディング"と呼ばれるC++ 17の機能を使用しています。 C++ 17コンパイラをお持ちでない場合は、 'const auto&p:words'を使って' p.first'と 'p.second'を使ってペアメンバーにアクセスできます。 –

関連する問題