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

时间:2016-10-06 22:21:10

标签: c++ for-loop vector

我正在使用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;

}
编辑:还注意到我的逻辑存在缺陷。如果一个数字出现超过两次,它将多次打印出来,它是重复的。这是多余的。

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

你几乎就在那里,这是我建议的解决方案:

live

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

}

答案 3 :(得分:0)

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

forms.py