Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查向量中的重复项_C++ - Fatal编程技术网

C++ 检查向量中的重复项

C++ 检查向量中的重复项,c++,C++,可能重复: 我必须检查一个向量是否重复。最好的方法是什么: 我取第一个元素,将它与向量中的所有其他元素进行比较。然后取下一个元素并执行相同的操作,依此类推 这是最好的方法,还是有更有效的方法来检查DUP?使用插入每个元素的方法。在插入元素之前,请检查它是否已经存在。如果是的话,你有一个复制品。这是O(n)平均值,但最坏的情况与您当前的方法一样糟糕 或者,您也可以在O(n log n)最坏情况下使用来执行相同的操作。这与排序解决方案一样好,只是它不改变元素的顺序(尽管创建了一个集合后使用了更多内

可能重复:

我必须检查一个向量是否重复。最好的方法是什么:

我取第一个元素,将它与向量中的所有其他元素进行比较。然后取下一个元素并执行相同的操作,依此类推

这是最好的方法,还是有更有效的方法来检查DUP?

使用插入每个元素的方法。在插入元素之前,请检查它是否已经存在。如果是的话,你有一个复制品。这是
O(n)
平均值,但最坏的情况与您当前的方法一样糟糕

或者,您也可以在
O(n log n)
最坏情况下使用来执行相同的操作。这与排序解决方案一样好,只是它不改变元素的顺序(尽管创建了一个集合后使用了更多内存)

另一种方法是将你的向量复制到另一个向量上,对它进行排序,然后检查相邻的元素。我不确定这是否比集合解决方案快,但我认为排序比集合使用的平衡搜索树增加的开销更少,因此在实践中应该更快


当然,如果您不关心保持元素的原始顺序,只需对初始向量进行排序。

排序然后比较相邻元素是一种方法。排序需要进行O(n logn)比较,然后再进行n-1比较相邻元素


问题中的方案将进行(n^2)/2次比较。

如果向量是STL容器,则解决方案很简单:

std::sort(myvec.begin(), myvec.end());
std::erase(std::unique(myvec.begin(), myvec.end()), myvec.end());

根据cppreference(),元素被移动,因此从
myvec.begin()
std::unique
的返回值的值都是唯一的。
std::unique
返回的迭代器后面的元素是未指定的(在我看到的每个用例中都是无用的),因此使用
std::vector::erase
将它们从
std::vector
中删除。您也可以使用二进制搜索

这里有两个很好的例子可以帮助您:


如果您不关心偶尔出现的假阳性,您可以使用a来检测集合中可能存在的重复项。如果不能接受误报,则获取未通过筛选的值,并对这些值执行第二次检测。失败值的列表应该相当小,尽管它们需要对照完整输入进行检查。

不如排序解决方案“好”。这是相同的big-O运行时顺序,但排序向量的常量因子(保证其元素在内存中连续)将显著小于使用集合的算法。如果速度是原来的两倍,我一点也不会感到惊讶+1无论如何。我想你的答案是最好的。@A.Levy:是的,我提到了另一种方法。基数排序可以比O(n logn)更快@马克·兰瑟姆,基数排序很少适用。@avakar,对,但很少和从不一样。我认为,因为没有库实现,它被遗忘的频率比它应该的要高;它们刚从靶场前端移除。
std::unique()
返回的新结束后的元素值未指定。如果您只想测试该范围是否不包含重复项,
std::innect_find()
比使用
std::unique()
更有效。您是对的。unique将所有的unique元素放在第一位,而不指定容器的其余部分会发生什么。然而,最重要的是要记住,您应该使用返回的迭代器,而不是假设您的容器只包含唯一的元素。你必须手动清理容器的尾部。你能修改向量吗?如果没有,您有内存分配副本吗?“…获取下一个元素并执行相同的操作…”值得一提的是,当您查看第二个元素时,可以忽略第一个元素;-)(当您查看第三个元素时,可以忽略前两个元素,以此类推)