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)
在谷歌寻找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)
你应该使用 set
set<int> s(a.begin(), a.end());
return s.size() != a.size();
Run Code Online (Sandbox Code Playgroud)