检查std :: vector有重复项

rrc*_*rrc 7 c++ algorithm for-loop vector duplicates

我想检查一个整数向量是否有任何重复,如果有,则必须返回true.所以我尝试做这样的事情:

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());
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为unqiue不能被指定为bool值.我该怎么办呢?如果我要写一个for循环来执行相同的操作,我该怎么做?

Jan*_*cek 15

您正在寻找的算法是std::adjacent_find

// The container must be sorted!
const std::vector<int> sortedVector = {1,2,3,3,4,5};
const bool hasDuplicates = std::adjacent_find(sortedVector.begin(), sortedVector.end()) != sortedVector.end();
Run Code Online (Sandbox Code Playgroud)

与 std::unique 不同,std::adjacent_find 不修改容器。

作为奖励, std::adjacent_find 返回一个迭代器到重复的“pair”中的第一个元素:

const auto duplicate = std::adjacent_find(sortedVector.begin(), sortedVector.end());
if (duplicate != sortedVector.end())
    std::cout << "Duplicate element = " << *duplicate << "\n";
Run Code Online (Sandbox Code Playgroud)

  • 仅适用于已排序的容器 (2认同)

mks*_*eve 8

在谷歌寻找std::unique我发现这个页面cplusplus:独特.我看了一下a)它做了什么

从每个连续组中删除除第一个元素之外的所有元素

所以它看起来像你想要的 - 删除重复.

然后我看看它返回什么,以及一些评论,遇到问题......

返回值:未删除的最后一个元素后面的元素的迭代器.

因此,唯一的结果是一个不必与整个向量相同的序列.

如果没有删除任何内容,则返回值将是向量的结尾.

所以

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

或者对于C++ 11

auto it = std::unique( a.begin(), a.end() );
bool wasUnique = (it == a.end() );
Run Code Online (Sandbox Code Playgroud)

最后,为了使用唯一函数,需要对向量进行排序,因此完整的代码将包括

sort(a.begin(), a.end());
Run Code Online (Sandbox Code Playgroud)

例如

sort(a.begin(), a.end());
auto it = std::unique( a.begin(), a.end() );
bool wasUnique = (it == a.end() );
Run Code Online (Sandbox Code Playgroud)

  • _“所以它看起来就像你想要的那样 - 删除重复项。”_ 什么?!OP 到底在哪里要求删除重复项?这个答案是错误的,因为“std::unique”修改了向量。 (2认同)

Gia*_*ang 7

你应该使用 set

set<int> s(a.begin(), a.end());
return s.size() != a.size();
Run Code Online (Sandbox Code Playgroud)

  • @snooze_bear 这应该和排序一样快,但是如果你使用 `std::unordered_set` 代替 `std::set` 它会更快,因为它是一个哈希集。 (2认同)