繁体   English   中英

如何计算向量中的重复项 (C++)

[英]How to count duplicates in a vector (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;

}

编辑:也只是注意到我的逻辑有缺陷。 如果一个数字出现两次以上,它会多次打印出它是重复的。 这是多余的。

使用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 <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";
}

你快到了,这是我建议的解决方案:

直播

#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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM