2016-10-06 4 views
0

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

Вот мой код:

#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: Кроме того, только заметил, что моя логика ошибочна. Если число появляется более двух раз, оно будет печатать несколько раз, это дубликат. Это избыточно.

+0

Если он находит те же повторяющиеся несколько раз подряд, то есть, как вы знаете, количество дублей. –

ответ

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; 

} 
+0

Протестировано это, и он говорит, что каждое значение дублируется, даже если это не так. Даже если номер появляется только после того, как он говорит, что он дублируется 1 раз, что неверно. Не грубить просто подумал, что вы должны знать. – MKSnazzy

+0

@Matt исправил его. – marcinj

+0

@matt Я переписал этот пример, используя немного меньше достижений C++: http://coliru.stacked-crooked.com/a/450e2cb42622383b – marcinj

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"; 
} 
+0

Я не знаю, что такое карта – MKSnazzy

+0

@Matt http://en.cppreference.com/w/cpp/container/map –

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 
+0

Спасибо. Я новичок в C++. Даже после чтения ссылки я не знаю, что такое карта. Также почему вы добавили + 1 в конце объявленной заявки? Я удалил его, чтобы проверить, и он работает так же. Просто интересуюсь. – MKSnazzy

+0

@Matt, чтобы начать сравнивать с индексом 1 вместо 0. –

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); 
Смежные вопросы