如何计算vector中的重复项(c++)

How to count duplicates in a vector (C++)

本文关键字:c++ vector 何计算 计算      更新时间:2023-10-16

我正在用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;
}
编辑:我也注意到我的逻辑是有缺陷的。如果一个数字出现两次以上,它将打印多次,这是一个重复。这是多余的

使用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

你就快成功了,我的建议是:

生活
#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;
}

您可以将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);

一个愚蠢但快速的解决方案:

#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 << " duplicatesn";
}