2016-10-06 3 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:また、ちょうど私のロジックは欠陥がある気づい

は、ここに私のコードです。数字が2回以上出現した場合は、重複して複数回印刷されます。それは冗長です。

+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); 
関連する問題