2017-09-28 8 views
2

整数のベクトルに重複があるかどうかを確認したい場合はtrueを返します。std :: vectorに重複があります

vector<int> uGuess = {1,2,3,3,4,5} 
vector<int> a = uGuess; 
sort(a.begin(), a.end()); 
bool d = unique(a.begin(), a.end()); 

そしてunqiueはbool値として割り当てることができないので、これは動作しません。だから私はこのような何かをしよう。 これに向けてどうすればよいですか? 同じアクションを実行するforループを作成する場合、どうすればよいですか?

+1

#myhomeworkonSO – Gabriel

+0

'unique'はあなたがそれをのstd ::ユニーク(a.begin = – patatahooligan

+3

'自動やりたい記述しているものを行いません()、a.end()); bool b = it == a.end(); ' – Jarod42

答えて

3

Googleで見るstd::unique私はこのページを見つけましたcplusplus : unique重複を取り除く - 私はそれが

はそれが何をしたいんようにそうに見えるすべてが、すべての連続したグループの最初の要素

を削除しなかったものをA) を見ました。

私はそれを返す何を見て、いくつかのコメント、問題に出くわす...

戻り値:最後の要素は削除されませんが、次の要素へのイテレータ。

したがって、ユニークからの結果は、ベクトル全体と同じである必要はありません。

何も削除されなかった場合、戻り値はベクトルの末尾になります。

ので

vector<int>::iterator it = std::unique(a.begin(), a.end()); 
bool wasUnique = (it == a.end()); 

またはC++ 11

auto it = std::unique(a.begin(), a.end()); 
bool wasUnique = (it == a.end()); 
0

ため、誰かが自分のアルゴリズム記述するように強制されている場合:

bool hasDuplicates(const std::vector<int>& arr) { 
    for (std::size_t i = 0; i < arr.size(); ++i) { 
     for (std::size_t j = i + 1; j < arr.size(); ++j) { 
      if (arr[i] == arr[j]) 
       return true; 
     } 
    } 
    return false; 
} 

をしかし、実際のコードでは、あなたがその事を使用する必要がありますすでに存在し、標準ライブラリに存在します。

1

使用std::unique()、このような:

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
    std::vector<int> v = {1,2,3,3,4,5}; 
    auto it = std::unique(v.begin(), v.end()); 
    std::cout << ((it == v.end()) ? "Unique\n" : "Duplicate(s)\n"); 
    return 0; 
} 

出力:

重複(複数可)

-1

これまでのところ、すべてのこれらのソリューションのいずれかのコンテナを変更したり、Oを持っている(n²)複雑。あなたはSTDを置くことができます::より良い使用にマップ:

#include <algorithm> 
#include <iterator> 
#include <map> 

template <typename Iterator> 
bool has_duplicates(Iterator first, Iterator last) 
{ 
    std::map <typename std::iterator_traits <Iterator> ::value_type, std::size_t> histogram; 

    while (first != last) 
    if (++histogram[ *first++ ] > 1) 
     return true; 

    return false; 
} 

#include <iostream> 
#include <vector> 

int main() 
{ 
    using std::begin; 
    using std::end; 

    int a[] = { 2, 3, 5, 7, 11 }; 
    int b[] = { 2, 3, 5, 5, 7 }; 

    std::vector <int> c(begin(a), end(a)); 
    std::vector <int> d(begin(b), end(b)); 

    std::cout << std::boolalpha; 
    std::cout << "a has duplicates false : " << has_duplicates(begin(a), end(a)) << "\n"; 
    std::cout << "b has duplicates true : " << has_duplicates(begin(b), end(b)) << "\n"; 
    std::cout << "c has duplicates false : " << has_duplicates(begin(c), end(c)) << "\n"; 
    std::cout << "d has duplicates true : " << has_duplicates(begin(d), end(d)) << "\n"; 
} 
+0

これは、より多くのメモリを使用し、ベクトルをソートするよりも速くはありません。 – Sopel

+0

はい、ただし、ベクトルをソートすると元のコンテンツが変更されます。 –

+0

あなたはそれをコピーすることができます... – Sopel

関連する問題