Как подсчитать дубликаты в векторе (C++)

Я работал над упражнением в C++ Primer. На самом деле, я доработал свою первую версию. Проблема в том, что я хочу не только обнаружить дубликаты в векторе, но и сколько раз они были дублированы. С последним у меня проблемы.

Вот мой код:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {

vector<int> nums{1,3,1,5,7,8,9,7};

sort(nums.begin(), nums.end());

for(unsigned int i = 0; i != nums.size(); ++i){
if(nums[i] == nums[i + 1]){
    cout << nums[i] << " is a duplicated number" << endl;
    }
}



return 0;

}

EDIT: также только что заметил, что моя логика несовершенна. Если число появляется более двух раз, оно будет распечатываться несколько раз, это дубликат. Что является излишним.

4 ответа

  1. Глупое, но быстрое решение:

    #include <map>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        vector<int> nums{1,3,1,5,7,8,9,7,1};
        std::map<int, int> dups;
        for(int i : nums)
            ++dups[i];
        for(auto& dup : dups)
            cout << "Number " << dup.first << " has " << dup.second - 1 << " duplicates\n";
    }
    
  2. Использовать a std::map

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <map>
    using namespace std;
    
    int main() 
    {
        map<int, int> duplicate;
        vector<int> nums{1,3,1,5,7,8,9,7,1};
        vector<int> nums_sorted{nums};
        sort(begin(nums_sorted), end(nums_sorted));
    
        auto beg = begin(nums_sorted) + 1;
        for (;beg != end(nums_sorted); ++beg) {
            if (*beg == *(beg - 1)) {
                duplicate[*beg]++;
            }
        }
    
        for (const auto& i : duplicate)
            cout << i.first << " appear " << i.second+1 << " times" << '\n';
    }
    

    Выходы:

    1 appear 3 times
    7 appear 2 times
    
  3. Вы были почти там, вот мое предлагаемое решение:

    жить

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int main() {
    
    vector<int> nums{1,3,1,5,7,8,9,7};
    
    sort(nums.begin(), nums.end());
    
    for(auto it = std::cbegin(nums); it != std::cend(nums); ) {  
    
        int dups = std::count(it, std::cend(nums), *it);
        if ( dups > 1 )
            cout << *it << " is a duplicated number, times: " << dups << endl;
        for(auto last = *it;*++it == last;);
    }
    
    return 0;
    
    }
    
  4. Вы можете создать пару std::unique<>()с std::distance<>():

    std::sort(nums.begin(), nums.end());
    auto unique_end = std::unique(nums.begin(), nums.end());
    std::cout << std::distance(nums.begin(), unique_end);