2017-04-10 84 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的功能,称为“结构化绑定”来解构words的成对[k, v]。如果您没有C++ 17编译器,则可以使用const auto& p : words并使用p.firstp.second访问配对成员。

+0

我忘了我们现在可以在野外看到C++ 17:') –

+0

我在第二个for循环中出现const错误。我应该包括任何东西。说“预计表达” – TeodorKolev

+0

@TeodorKolev:我正在使用称为“结构化绑定”的C++ 17功能。如果您没有C++ 17编译器,则可以使用'const auto&p:words'并使用'p.first'和'p.second'访问配对成员。 –

相关问题