2016-10-06 2 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; 

} 

편집 : 또한 내 논리가 결함이 발견

여기 내 코드입니다. 숫자가 두 번 이상 나타나면 여러 번 인쇄됩니다. 중복 된 것입니다.

+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++에 익숙하다. 참조를 읽은 후에도지도가 무엇인지 알 수 없습니다. 또한 beg 선언의 끝에 + 1을 추가 했습니까? 테스트를 위해 제거했고 동일하게 작동합니다. 그냥 궁금해. – MKSnazzy

+0

@Matt가 0 대신 색인 1에서 비교를 시작합니다. –

0

당신은 std::distance<>()std::unique<>()를 쌍을 수 있습니다

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